دالة toString()
جزء من قسم البرمجة كائنية التوجه في رحلة Java على Coddy. الدرس 41 من 87.
كل class في Java ترث من class Object، الذي يوفر عدة method مفيدة. ومن أكثرها شيوعًا في إعادة التعريف toString()، الذي يُرجع تمثيلًا نصيًا لـ object.
افتراضيًا، تُرجع toString() اسم class متبوعًا برمز تجزئة object، وهذا ليس مفيدًا جدًا:
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
Person p = new Person("Alice", 25);
System.out.println(p); // Person@15db9742من خلال إعادة تعريف toString()، يمكنك توفير مخرجات ذات معنى تصف حالة object:
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person[name=" + name + ", age=" + age + "]";
}
}
Person p = new Person("Alice", 25);
System.out.println(p); // Person[name=Alice, age=25]يتم استدعاء toString() method تلقائيًا عندما تطبع object أو تدمجه مع سلسلة نصية. وهذا يجعل تصحيح الأخطاء أسهل بكثير، إذ يمكنك رؤية محتويات object بسرعة من دون كتابة تعليمات برمجية إضافية.
التحدي
سهللنبنِ نظامًا لجرد المنتجات يعرض معلومات مفيدة حول العناصر باستخدام تطبيقات مخصّصة لـ toString(). ستنشئ فئة Product تتجاوز طريقة toString() الافتراضية لتوفير تمثيل واضح وسهل القراءة لكل منتج.
ستنظّم التعليمات البرمجية عبر ملفين:
Product.java: أنشئ فئة تمثّل عنصرًا في المخزون. يحتوي كل Product على ثلاثة fields من النوع private:name(String)، وprice(double)، وquantity(int). أضف Constructor يقوم بتهيئة جميع fields الثلاثة. تجاوز طريقةtoString()لإرجاع سلسلة منسّقة بهذا format الدقيق:Product[name=X, price=Y, quantity=Z]حيث تمثّل X وY وZ قيم fields الفعلية. يجب عرض price كرقم عادي (لا حاجة إلى تنسيق خاص).Main.java: اجعل فئة Product الخاصة بك تعمل من خلال إنشاء المنتجات وعرضها. ستتلقى ثلاثة inputs: اسم منتج (String)، وسعرًا (double)، وكميةً (int). أنشئ Product باستخدام هذه values، ثم اطبع كائن المنتج مباشرةً باستخدامSystem.out.println(). بفضل طريقةtoString()التي تجاوزتها، سيعرض هذا تلقائيًا معلومات المنتج المنسّقة بدلًا من المخرجات الافتراضية الغامضة!
ستتلقى ثلاثة inputs: اسم المنتج (String)، والسعر (double)، والكمية (int).
لاحظ كيف تؤدي طباعة الكائن مباشرةً إلى استدعاء طريقة toString() تلقائيًا. وهذا ما يجعل تصحيح الأخطاء وتسجيلها أسهل بكثير في التطبيقات الحقيقية!
جرّب بنفسك
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// قراءة المدخلات
String name = scanner.nextLine();
double price = scanner.nextDouble();
int quantity = scanner.nextInt();
// TODO: إنشاء كائن Product باستخدام القيم المدخلة
// TODO: طباعة كائن product مباشرة
// (سيؤدي هذا تلقائيًا إلى استدعاء دالة toString() الخاصة بك!)
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1أساسيات الـ OOP
الملفات الخارجيةمقدمة في الـ OOPالفئات (Classes) مقابل الكائنات (Objects)الكلمة المفتاحية thisالدوال (Methods)الحقول (Attributes)دالة البناء (Constructor)تعدد أشكال دالة البناء (Constructor Overloading)مراجعة - آلة حاسبة بسيطة4الوراثة
الوراثة الأساسية (extends)الكلمة المفتاحية superإعادة تعريف الدوال (@Override)تسلسل المنشئات (Constructor Chaining)كلاس Objectالوراثة الأحادية ومتعددة المستوياتلماذا لا توجد وراثة متعددة للكلاساتمراجعة - هيكلية الموظفين7الدوال الخاصة وفئة Object
دالة toString()equals() و hashCode()دالة clone()compareTo() و Comparableواجهة Comparatorمراجعة - الترتيب المخصص2محددات الوصول والتغليف
نظرة عامة على مستويات الوصولدوال Getter و Setterإخفاء البياناتالكلمة المفتاحية finalمراجعة - مدير الحساب البنكي5تعدد الأشكال (Polymorphism)
أساسيات الـ Method Overloadingالـ Method Overriding (في وقت التشغيل)الـ Upcasting والـ Downcastingمعامل الـ instanceofالفئات والدوال المجردة (Abstract)مراجعة - حاسبة الأشكال8مفاهيم OOP المتقدمة
الـ Composition مقابل الـ Inheritanceالـ Aggregation مقابل الـ Compositionالفئات الداخلية والمتداخلة والمجهولة (Inner, Nested & Anonymous)الـ Enums ودوالهاالـ Records (Java 16+)الـ Sealed Classes (Java 17+)11أنماط التصميم - الجزء الأول
مقدمة في أنماط التصميمنمط Singletonنمط Factoryنمط Builderنمط Observerنمط Strategy3خصائص الفئة والعضو الساكن
المتغيرات الخاصة بالكائن مقابل المتغيرات الساكنةالدوال الساكنةالكتل البرمجية الساكنةالثوابت (static final)ملخص - العداد والأدوات المساعدة6الواجهات (Interfaces) والأصناف المجردة (Abstract Classes)
مقدمة في الواجهات (Interfaces)تنفيذ الواجهات (Interfaces)تنفيذ واجهات متعددةالـ Default و Static في الواجهاتالأصناف المجردة مقابل الواجهاتالواجهات الوظيفية (Functional Interfaces)مراجعة - نظام الدفع9الأنواع العامة (Generics)
مقدمة في الأنواع العامةالأصناف العامة (Generic Classes)الدوال العامة (Generic Methods)معاملات الأنواع المقيدةالرموز البديلة (?, extends, super)مراجعة - الحاويات العامة12أنماط التصميم - الجزء الثاني
نمط الأمرنمط المحولنمط المزيننمط طريقة القالبنمط الحالةنمط التركيبنمط المكررتدرّب بنفسك: مترجم Java عبر الإنترنت