البرمجة

تهيئة الكائنات والبواني في جافا

البواني وتهيئة الكائنات (Object Initialization) في جافا

تُعد عملية تهيئة الكائنات (Object Initialization) من المفاهيم الجوهرية في لغات البرمجة الكائنية التوجه، وبالأخص في لغة جافا (Java)، التي تُعتبر من أقوى اللغات في دعم البرمجة الكائنية. تتضمن عملية تهيئة الكائنات عدة عناصر منها: البواني (Constructors)، كتل التهيئة (Initialization Blocks)، القيم الافتراضية (Default Values)، وكلمة المفتاح this. يلعب كلٌ من هذه العناصر دورًا دقيقًا في كيفية إنشاء الكائنات وضمان جاهزيتها للاستخدام ضمن التطبيق.

المفهوم الأساسي للكائنات (Objects)

الكائن في جافا هو نسخة (instance) من الصنف (class). عند تعريف صنف معين فإنه يُمثل قالبًا أو مخططًا لإنشاء الكائنات. يحتوي الصنف على بيانات (متغيرات العضو) وسلوكيات (الدوال أو الطرق)، وعند إنشاء كائن من هذا الصنف باستخدام الكلمة المفتاحية new، يتم تخصيص مساحة في الذاكرة له، وتبدأ عملية تهيئته لضمان أن حالته الداخلية صحيحة وجاهزة للتفاعل مع باقي أجزاء البرنامج.

البواني (Constructors) في جافا

الباني هو دالة خاصة في الصنف تُستخدم لتهيئة الكائن عند إنشائه. يتم استدعاؤه تلقائيًا فور استخدام الكلمة new. يتميز الباني بما يلي:

  • يحمل نفس اسم الصنف.

  • لا يحتوي على نوع إرجاع (حتى void لا يُكتب).

  • يمكن أن يكون هنالك أكثر من باني واحد في نفس الصنف (Overloading).

  • يمكن أن يكون عامًا public أو خاصًا private حسب الحاجة.

أنواع البواني

1. الباني الافتراضي (Default Constructor)

إذا لم يكتب المبرمج أي باني داخل الصنف، فإن جافا تقوم بتوليد باني افتراضي بدون معاملات تلقائيًا. مثال:

java
public class Person { String name; int age; }

في هذا المثال، يقوم المترجم بإضافة باني بالشكل التالي:

java
public Person() { }

2. الباني المعرف من قبل المستخدم (User-defined Constructor)

يمكن كتابة بواني تقبل معاملات بهدف تهيئة المتغيرات مباشرة عند إنشاء الكائن.

java
public class Person { String name; int age; public Person(String n, int a) { name = n; age = a; } }

في هذا السيناريو، يمكن إنشاء كائن باستخدام:

java
Person p = new Person("Ali", 30);

3. تحميل البواني (Constructor Overloading)

يدعم جافا ميزة تحميل البواني، أي يمكن إنشاء أكثر من باني بنفس الاسم ولكن بمعاملات مختلفة.

java
public class Book { String title; int pages; public Book() { title = "Unknown"; pages = 0; } public Book(String t) { title = t; pages = 100; } public Book(String t, int p) { title = t; pages = p; } }

استخدام الكلمة المفتاحية this

تُستخدم الكلمة this داخل الباني للإشارة إلى الكائن الحالي. وهي ضرورية عند وجود التباس بين أسماء المعاملات ومتغيرات العضو.

java
public class Car { String model; public Car(String model) { this.model = model; } }

كما تُستخدم this() لاستدعاء باني آخر من نفس الصنف، مما يسمح بإعادة استخدام الكود داخل البواني المختلفة:

java
public class Student { String name; int age; public Student() { this("Unknown", 0); } public Student(String name, int age) { this.name = name; this.age = age; } }

كتل التهيئة (Initialization Blocks)

1. الكتلة الابتدائية (Instance Initialization Block)

تُستخدم هذه الكتلة لتهيئة الكائن في حال تكرار الكود عبر بواني متعددة. تُنفذ هذه الكتلة قبل تنفيذ الباني مباشرة.

java
public class Animal { String type; { type = "Unknown"; System.out.println("Instance block executed"); } public Animal() { System.out.println("Constructor executed"); } }

2. الكتلة الثابتة (Static Initialization Block)

تُستخدم لتهيئة البيانات الثابتة (static variables) مرة واحدة عند تحميل الصنف في الذاكرة.

java
public class Config { static String ENV; static { ENV = "PRODUCTION"; System.out.println("Static block executed"); } }

تهيئة القيم الافتراضية (Default Initialization)

عند إنشاء كائن من صنف ما، فإن جافا تقوم تلقائيًا بتهيئة المتغيرات ذات النطاق الواسع (متغيرات العضو) بالقيم الافتراضية الخاصة بنوعها:

نوع المتغير القيمة الافتراضية
int 0
double 0.0
boolean false
char ‘\u0000’
المراجع null

لكن المتغيرات المحلية لا تُهيأ تلقائيًا ويجب تعيين قيمة لها يدويًا قبل الاستخدام.

ترتيب التهيئة في جافا

عند إنشاء كائن جديد باستخدام new، يتم تنفيذ الخطوات التالية بترتيب محدد:

  1. يتم تحميل الصنف في الذاكرة (عند الحاجة فقط).

  2. تنفيذ الكتل الثابتة (Static Blocks).

  3. يتم تخصيص مساحة في الذاكرة للكائن الجديد.

  4. تعيين القيم الافتراضية للمتغيرات.

  5. تنفيذ الكتل الابتدائية (Instance Initialization Blocks).

  6. تنفيذ الباني المناسب.

جدول يلخص ترتيب التنفيذ

المرحلة التفاصيل
1 تحميل الصنف وتنفيذ static blocks
2 تخصيص الذاكرة للكائن
3 تعيين القيم الافتراضية
4 تنفيذ Instance Initialization Blocks
5 تنفيذ الباني

التهيئة عبر الموروثات (Inheritance and Initialization)

عند استخدام الوراثة في جافا، فإن عملية التهيئة تمتد من الصنف الأب إلى الابن. يتم أولاً تنفيذ باني الصنف الأب ثم باني الصنف الابن، ويحدث ذلك تلقائيًا عبر استدعاء super().

java
public class Animal { public Animal() { System.out.println("Animal constructor"); } } public class Dog extends Animal { public Dog() { System.out.println("Dog constructor"); } }

الناتج عند إنشاء كائن جديد من Dog سيكون:

kotlin
Animal constructor Dog constructor

كما يمكن استدعاء باني محدد من الصنف الأب باستخدام super(arguments)، بشرط أن يكون هذا الاستدعاء في أول سطر من باني الصنف الابن.

البواني الخاصة (Private Constructors)

يُستخدم هذا النوع من البواني عادة في الأنماط التصميمية مثل نمط Singleton، حيث يمنع إنشاء أكثر من كائن واحد من الصنف:

java
public class Singleton { private static Singleton instance = new Singleton(); private Singleton() { } public static Singleton getInstance() { return instance; } }

التهيئة باستخدام الكائنات الثابتة (Factory Methods)

بدلًا من إنشاء الكائنات باستخدام new، يمكن استخدام دوال ثابتة تُعيد كائنات مهيأة بطريقة معينة. هذه الطريقة تعزز من التحكم في إنشاء الكائنات وتُستخدم في أنماط التصميم الحديثة.

java
public class Shape { private String type; private Shape(String type) { this.type = type; } public static Shape createCircle() { return new Shape("Circle"); } public static Shape createSquare() { return new Shape("Square"); } }

خلاصة المفاهيم حول التهيئة في جافا

عملية تهيئة الكائنات في جافا هي بنية متكاملة تعتمد على أكثر من عنصر: البواني، الكتل الابتدائية والثابتة، الوراثة، واستخدام كلمات مفتاحية مثل this و super. يهدف هذا النظام إلى ضمان أن كل كائن يتم إنشاؤه يكون في حالة صالحة للاستخدام، سواءً كان ذلك من خلال إعداد البيانات، أو عبر التحكم الدقيق في تسلسل التنفيذ.

يعتمد التصميم الفعال للبرمجيات الكائنية على فهم عميق لهذه العملية، لأنها تشكل العمود الفقري في بناء تطبيقات مرنة، قابلة للتوسع، وسهلة الصيانة.

المصادر