المُنشِئات والكلمة المفتاحية this
المُنشِئات والكلمة المفتاحية this
في الدرس السابق أضفت للفئة حقولًا وأساليب تصف الحالة والسلوك. لكن كيف يُولَد الكائن وهو يحمل بيانات ذات معنى منذ البداية؟ هذه هي مهمة المُنشِئ (Constructor). وحين تكون داخل المُنشِئ، كيف تُشير إلى الكائن الذي يُبنى في تلك اللحظة؟ هذه هي مهمة الكلمة المفتاحية this.
ما هو المُنشِئ؟
المُنشِئ هو أسلوب خاص تستدعيه Java تلقائيًا حين تكتب new ClassName(...). يشبه الأسلوب العادي لكنه لا يملك نوع إرجاع (ولا حتى void)، ويجب أن يتطابق اسمه تمامًا مع اسم الفئة بما فيه حالة الأحرف.
المُنشِئ الافتراضي
إن لم تكتب أي مُنشِئ، تُولّد Java بصمت مُنشِئًا افتراضيًا (بلا وسيطات) نيابةً عنك. يُهيّئ هذا المُنشِئ كل حقل بقيمة الصفر المناسبة لنوعه: 0 للأعداد، وfalse للقيم المنطقية، وnull للمراجع.
هذا مقبول للنماذج الأولية السريعة، لكن معظم الفئات الحقيقية تحتاج أن تُضبط حقولها بقيم ذات معنى منذ لحظة الإنشاء.
المُنشِئات ذات الوسيطات
يقبل المُنشِئ ذو الوسيطات مُدخلات كي يتمكن المستدعي من تحديد الحالة الابتدائية:
الآن كل BankAccount مضمون أن يبدأ بصاحب محدد ورصيد صريح. سيرفض المُصرِّف استدعاء new BankAccount() بلا وسيطات، مما يمنع إنشاء حسابات بأصحاب قيمتهم null عن طريق الخطأ.
الكلمة المفتاحية this — فصل التسميات المتشابهة
في المثال أعلاه، تحمل وسيطة المُنشِئ الاسم owner وكذلك الحقل. داخل المُنشِئ، تُخفي الوسيطة المحلية الحقلَ بنفس الاسم. كتابة owner = owner ببساطة ستُسنِد الوسيطة إلى نفسها — عملية بلا أثر. تحل this هذا بأناقة:
this.owner— يُشير إلى الحقل في الكائن الحالي.owner(بلا بادئة) — يُشير إلى الوسيطة المحلية.
this ببساطة مرجع للكائن الذي يُبنى حاليًا (أو الكائن الذي يُستدعى عليه الأسلوب). وهي متاحة في أي أسلوب أو مُنشِئ غير ثابت.
this) هو الأسلوب الأكثر شيوعًا في Java. يجعل النية واضحة تمامًا: "أسنِد الوسيطة إلى الحقل المتطابق في الاسم."
تعدد المُنشِئات (Overloading)
تسمح Java بتعريف مُنشِئات متعددة طالما تختلف قوائم وسيطاتها (عددًا أو أنواعًا). يُسمى هذا تعدد المُنشِئات:
تسلسل المُنشِئات بـ this()
تكرار منطق التهيئة عبر مُنشِئات متعددة أمر هشّ — إن تغيّر المنطق يجب تحديث كل نسخة. يحل تسلسل المُنشِئات هذه المشكلة: يستدعي مُنشِئ مُنشِئًا آخر في نفس الفئة باستخدام this(...).
this(...) أول سطر داخل المُنشِئ دون استثناء. لا يمكن تنفيذ أي عمل آخر قبل التفويض. هذا يضمن اكتمال تهيئة الكائن قبل تشغيل أي منطق إضافي.
النمط المُعتاد — مُنشِئ واحد مكتمل الوصف يؤدي كل العمل، ومُنشِئات أقصر تُفوّض إليه — يُبقي منطق التهيئة في مكان واحد ويُسهّل الصيانة.
الخلاصة
- المُنشِئ يُهيّئ كائنًا جديدًا. لا يملك نوع إرجاع ويطابق اسم الفئة.
- يُوفَّر المُنشِئ الافتراضي مجانًا حين لا تكتب أيًا؛ يختفي حالما تكتب مُنشِئًا واحدًا.
- المُنشِئات ذات الوسيطات تُجبر على تقديم البيانات الضرورية عند الإنشاء.
this.fieldيُميّز حقلًا عن وسيطة تحمل نفس الاسم داخل مُنشِئ أو أسلوب.this(...)يُسلسل مُنشِئًا إلى آخر في نفس الفئة ويجب أن يكون أول سطر.