التابع toString
التابع toString
كل كائن في Java يمتلك قدرة مدمجة على تمثيل نفسه كنص. تأتي هذه القدرة من التابع toString() المُعرَّف في java.lang.Object — الجذر الذي ترثه جميع الفئات في Java. ولأن كل فئة تكتبها ترث تلقائيًا من Object، فإن كل كائن يمتلك بالفعل تابع toString() قبل أن تكتب سطرًا واحدًا.
ما الذي يُنتجه toString الافتراضي؟
التنفيذ الافتراضي الموروث من Object يُنتج سلسلة نصية تجمع اسم الفئة الكامل مع رمز تعريف الكائن (identity hash code) بالنظام السادس عشر:
لنرَ ذلك عمليًا. افترض أن لديك فئة بسيطة BankAccount وحاولت طباعتها:
الناتج لا معنى له أثناء التصحيح. لا يمكنك معرفة المالك أو الرصيد من رمز سادس عشري. لهذا السبب بالضبط يُعدّ تجاوز toString() من أول الأشياء التي يفعلها مطور Java المحترف عند إنشاء فئة جديدة.
toString() تلقائيًا على الكائن في كل مرة تحتاج فيها إلى تمثيله كنص: داخل System.out.println(obj)، وأثناء دمج السلاسل النصية ("Account: " + obj)، وداخل أدوات التصحيح والسجلات ومعظم بيئات التطوير. نادرًا ما تستدعيه بالاسم؛ Java تفعل ذلك عنك.
تجاوز toString
التجاوز يعني تقديم نسختك الخاصة من التابع لتحلّ محل الموروثة. يجب أن يتطابق التوقيع تمامًا: يجب أن يكون public، ويُعيد String، ولا يأخذ معاملات. الحاشية @Override غير مطلوبة، لكنها موصى بها بشدة — فهي تُخبر المُصرِّف بأنك تنوي تجاوز تابع موروث، فيتمكن من اكتشاف الأخطاء المطبعية أو التواقيع الخاطئة.
الناتج الآن مفيد على الفور. يستطيع أي شخص يقرأ سجلًا أو يُصحّح خطأً في بيئة التطوير أن يفهم الكائن في لمحة.
تنسيق الأرقام في toString
قد تُنتج قيم double الخام ناتجًا مزعجًا مثل 1500.0000000001 بسبب دقة الفاصلة العائمة. استخدم String.format() للتحكم في العرض:
%.2f يُنسّق رقم الفاصلة العائمة بمنزلتين عشريتين تمامًا — مثالي للعملات.
%s خانة سلسلة نصية و%d خانة عدد صحيح.
مثال واقعي بحقول متعددة
إليك فئة Product ذات حقول متعددة لتوضيح كيفية توسيع toString():
toString ودمج السلاسل النصية
بما أن Java تستدعي toString() تلقائيًا أثناء الدمج، يمكنك تضمين الكائنات مباشرةً داخل سلاسل نصية أكبر:
toString() الذي يتضمن كلمات المرور أو أرقام بطاقات الائتمان أو المفاتيح السرية يُشكّل خطرًا أمنيًا — تلك السلاسل تنتهي في السجلات وتتبّعات المكدس ورسائل الخطأ التي قد تراها أطراف غير مقصودة. أدرج فقط الحقول الآمنة للعرض العلني.
أساليب شائعة لتنسيق toString
لا يوجد تنسيق واحد مطلوب، لكن مجتمع Java يميل إلى أنماط متسقة قليلة:
- أسلوب الأقواس المتعرجة —
ClassName{field1=value1, field2=value2}(المستخدم في الأمثلة أعلاه، يطابق ما تُولّده بيئات التطوير تلقائيًا) - أسلوب الأقواس المربعة —
ClassName[field1=value1, field2=value2] - الأسلوب النثري — جملة بلغة طبيعية، مفيدة عندما يُعرض الكائن للمستخدمين النهائيين لا للمطورين
اختر الأسلوب الذي يناسب جمهورك. استخدم الأقواس المتعرجة أو المربعة للمخرجات الموجهة للمطورين، واستخدم الجملة الطبيعية عندما تظهر السلسلة في واجهة مستخدم أو بريد إلكتروني.
الخلاصة
يحوّل التابع toString() أي كائن إلى سلسلة نصية مقروءة للإنسان. النسخة الافتراضية الموروثة من Object تُنتج رمزًا سادس عشريًا لا فائدة منه أثناء التصحيح. بتجاوزها باستخدام @Override public String toString() تحصل على مخرجات ذات معنى في println، ودمج السلاسل، والسجلات، وأدوات التصحيح — وكل هذا مجانًا. أبعد الحقول الحساسة عنه، واستخدم String.format() لتنسيق الأرقام بشكل نظيف، والتزم بالأسلوب الذي تختاره في جميع أنحاء قاعدة الكود.