دالة البناء والتغليف
دالة خاصة تُستدعى تلقائيًّا لحظة إنشاء الكائن، لتعطي خصائصه قيمها الأولى.
- تكتب دالة البناء constructor بمعاملات وبدونها.
- تصل إلى خصائص الكائن ودواله.
- تخفي الخصائص بـ private وتصل إليها عبر get و set.
- تجمع البيانات والوظائف المترابطة في كلاس واحد.
١دالة البناء constructor
Book bk1 = new Book();| الشرط | التوضيح |
|---|---|
| الاسم | مطابق لاسم الكلاس |
| النوع الراجع | لا يُكتب أي نوع، ولا حتى void |
| إذا لم تكتبها | كل الكلاسات فيها دالة بناء افتراضية، لكن بلا عمل إضافي |
package library; public class Main { public static void main(String[] args) { Book bk1 = new Book(); }}
٢دالة بناء بمعاملات
تستقبل معاملات تُستخدم لتهيئة خصائص الكائن عند إنشائه: Book bk2 = new Book(2, "Learn Javan", "Fahad", 11.67,237);
٣الوصول إلى خصائص الكلاس
بعد إنشاء الكائن نصل إلى خصائصه بصيغة النقطة (.)، فنقرأ قيمتها أو نعدّلها. وفي NetBeans تظهر قائمة الخصائص تلقائيًّا بعد كتابة bk1.
package library;public class Main { public static void main(String[] args) { Book bk1 = new Book(); System.out.println("id: " + bk1.id); System.out.println("title: " + bk1.title); bk1.id = 1; bk1.title = "Java in 10 days"; bk1.author = "Ali"; bk1.price = 54.99; bk1.pages = 416; System.out.println("id: " + bk1.id); System.out.println("title: " + bk1.title); System.out.println("-------------------"); Book bk2 = new Book(2, "Learn Javan", "Fahad", 11.67,237); System.out.println("id: " + bk2.id); System.out.println("title: " + bk2.title); }}
ملفات المشروع في تبويبات كما في NetBeans. زر التشغيل يجمعها في ملف واحد ليعمل على OneCompiler.
قبل إعطاء bk1 قيمًا طُبعت القيم الافتراضية: 0 للعدد و null للنص.
٤وظائف الكلاس methods
الدوال تمثّل أفعال الكلاس، وتُعرَّف داخله، وتُستدعى عن طريق كائن معيّن فتعمل على خصائصه هو دون غيره. نضيف إلى Book الدالة printBookDetails() ونستدعيها لكل كتاب، وهذا هو التدريب العملي 5 التالي.
٥ما هو التغليف؟
خطوتان لتطبيقه
- اجعل الخصائص
private. - اكتب لكل خاصية دالتين
public:getX()تعيد القيمة، وsetX(...)تعدّلها بعد التحقق.
٦بدون تغليف: لا حماية
package user;public class User { public String username; public String password;}
بهذه الطريقة لا قيود على username ولا password، فيمكن إسناد أي قيمة نصية لهما مباشرة.
٧مع التغليف: شروط عند الإدخال
package lab10;public class User { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { if (username.contains("=")) { System.out.println("Error: username cannot " + "contain an equals sign (=)"); } else { this.username = username; } } public String getPassword() { return password; } public void setPassword(String password) { if (password.length() >= 6 && password.length() < 30) { this.password = password; } else { System.out.println("Error: password must be " + "6-30 characters long"); } }}
ملفات المشروع في تبويبات كما في NetBeans. زر التشغيل يجمعها في ملف واحد ليعمل على OneCompiler.
user1 لم يحقق الشرطين، فرُفضت القيمتان وبقيتا null. أما user2 فقُبل.
التوليد التلقائي في NetBeans
بدل كتابة دوال get و set يدويًّا، يولّدها NetBeans لك:
- انقر بالزر الأيمن داخل الكلاس User، واختر Insert Code (أو اضغط Alt+Insert).

- من قائمة Generate اختر Getter and Setter.

- حدّد الخصائص password و username، وفعّل خيار Encapsulate Fields ليحوّلها NetBeans إلى private تلقائيًّا، ثم اضغط Generate.
- أضف شروطك داخل دوال set، كما في التدريب 10.

٨فوائد التغليف
توقّع وتحقّق
أي رأس صحيح لدالة بناء في الكلاس Book؟
متى تُستدعى دالة البناء؟
ماذا يُطبع لخاصية نصية لم نعطها قيمة؟
في this.id = id; الكلمة this تشير إلى:
الدالة التي تعيد قيمة الخاصية name تُسمّى عادةً:
ما الناتج إذا رفضت setPassword القيمة ولم تُعطَ password قيمة قبلها؟
user.setPassword("12"); // أقل من 6System.out.println(user.getPassword());
أين نضع شرط «العمر لا يكون سالبًا»؟
الخلاصة
- دالة البناء تحمل اسم الكلاس وتُنفذ عند إنشاء الكائن بـ new.
- دالة البناء بمعاملات تعطي الكائن قيمه من البداية.
- التغليف: الخصائص private والوصول إليها عبر get و set.
- دالة set تتحقق من القيمة قبل قبولها.