📦 فهم الفئات الداخلية (Inner Classes) في جافا: تنظيم الكود داخل الكود!
اليوم سنتعرف على مفهوم قوي ومميز في لغة جافا يُساعد على تنظيم الكود بشكل أفضل: الفئات الداخلية (Inner Classes). تخيل أن لديك حقيبة (Class) رئيسية، وداخلها تحتفظ بمحفظة صغيرة (Inner Class) خاصة بأغراض معينة. هذا هو جوهر الفئات الداخلية! هيا نكتشفها معاً. 👇
الفئة الداخلية هي ببساطة فئة مُعرفة داخل فئة أخرى. لماذا نفعل ذلك؟ لأنها تسمح لنا بتجميع الفئات التي تُستخدم فقط في مكان واحد، مما يجعل الكود أكثر تنظيماً وسهولة في القراءة والصيانة.
🔍 لماذا نستخدم الفئات الداخلية؟
قبل أن نتعمق في الأنواع، دعنا نفهم الفوائد:
- تنظيم منطقي (Logical Grouping): إذا كانت الفئة (ب) لا فائدة لها إلا في خدمة الفئة (أ)، فمن المنطقي وضعها داخلها.
- زيادة التغليف (Increased Encapsulation): يمكن للفئة الداخلية الوصول إلى جميع أعضاء الفئة الخارجية (حتى الخاصة
private)، مما يسمح بتغليف أفضل للبيانات. - قراءة وصيانة أسهل: يجعل الكود أكثر قابلية للقراءة عن طريق تجميع الفئات ذات الصلة الوثيقة معاً.
🧩 أنواع الفئات الداخلية في جافا
هناك أربعة أنواع رئيسية من الفئات الداخلية. سنركز اليوم على الأنواع الأساسية المناسبة للمستوى الحالي.
1. الفئة الداخلية العضو (Member Inner Class) 👥
هذا هو أبسط نوع. إنها فئة غير static تُعرَّف داخل فئة أخرى، تماماً كأي عضو آخر (مثل متغير أو دالة).
كيف نُعرِّفها ونستخدمها؟
class OuterClass {
private String message = "أنا من الفئة الخارجية!";
// الفئة الداخلية العضو (Member Inner Class)
class InnerClass {
void display() {
System.out.println(message); // يمكنها الوصول إلى عضو 'private' في الفئة الخارجية!
}
}
}
public class Main {
public static void main(String[] args) {
// 1. إنشاء كائن من الفئة الخارجية أولاً
OuterClass outerObject = new OuterClass();
// 2. استخدام كائن الفئة الخارجية لإنشاء كائن من الفئة الداخلية
OuterClass.InnerClass innerObject = outerObject.new InnerClass();
// 3. استدعاء دالة الفئة الداخلية
innerObject.display(); // الإخراج: أنا من الفئة الخارجية!
}
}
ملاحظة مهمة: لإنشاء كائن من الفئة الداخلية، يجب أن يكون لديك أولاً كائن من الفئة الخارجية.
2. الفئة الداخلية الساكنة (Static Nested Class) ⚡
هي فئة static تُعرَّف داخل فئة أخرى. الفرق الرئيسي أنها لا يمكنها الوصول إلى الأعضاء غير الساكنة (مثل المتغيرات العادية) للفئة الخارجية مباشرة.
class OuterClass {
static String staticMessage = "رسالة ساكنة";
String normalMessage = "رسالة عادية"; // لا يمكن للفئة الساكنة الوصول لها مباشرة
static class StaticNestedClass {
void display() {
System.out.println(رسالةساكنة); // ✅ يمكن الوصول للأعضاء الساكنين
// System.out.println(رسالةعادية); // ❌ خطأ! لا يمكن الوصول لعضو غير ساكن
}
}
}
public class Main {
public static void main(String[] args) {
// لا نحتاج لكائن من الفئة الخارجية لإنشائها
OuterClass.StaticNestedClass staticNestedObject = new OuterClass.StaticNestedClass();
staticNestedObject.display(); // الإخراج: رسالة ساكنة
}
}
3. الفئة الداخلية المحلية (Local Inner Class) 🏠
هي فئة تُعرَّف داخل جسم دالة (method). نطاقها محدود داخل تلك الدالة فقط، ولا يمكن استخدامها من خارجها.
class OuterClass {
void outerMethod() {
class LocalInnerClass { // تعريف الفئة داخل الدالة
void display() {
System.out.println("مرحباً من الفئة المحلية!");
}
}
// إنشاء الكائن واستخدامه داخل نفس الدالة فقط
LocalInnerClass localInnerObject = new LocalInnerClass();
localInnerObject.display();
}
}
public class Main {
public static void main(String[] args) {
OuterClass outerObject = new OuterClass();
outerObject.outerMethod(); // الإخراج: مرحباً من الفئة المحلية!
// لا يمكنني إنشاء كائن من 'الداخليةالمحلية' هنا خارج الدالة
}
}
💡 ملخص سريع: مقارنة بسيطة
| النوع | الموقع | يحتاج لكائن خارجي؟ | يصل لأعضاء private الخارجية؟ |
|---|---|---|---|
| Member Inner Class | داخل الفئة (كعضو) | ✅ نعم | ✅ نعم |
| Static Nested Class | داخل الفئة (كعضو static) |
❌ لا | ❌ فقط الأعضاء static |
| Local Inner Class | داخل دالة | ✅ (من خلال الدالة) | ✅ نعم |
🎓 اختبر نفسك
التعليقات
شاركنا رأيك أو أسئلتك حول هذا المقال