Enums والفئات الداخلية
في هذا الدرس، سنتعلم كيفية استخدام Enums (الأنواع المحددة) والفئات الداخلية.
Enums — الأنواع المحددة
Enums هي نوع يحدد مجموعة ثابتة من الثوابت.
تعريف Enum
JAVA
public enum Day {
SUNDAY,
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY
}
استخدام Enum
JAVA
Day today = Day.MONDAY;
switch (today) {
case SATURDAY:
case SUNDAY:
System.out.println("عطلة نهاية الأسبوع!");
break;
default:
System.out.println("يوم عمل");
}
Enum مع متغيرات ودوال
JAVA
public enum Planet {
MERCURY (3.303e+23, 2.4397e6),
VENUS (4.869e+24, 6.0518e6),
EARTH (5.976e+24, 6.37814e6),
MARS (6.421e+23, 3.3972e6);
private final double mass; // كتلة
private final double radius; // نصف القطر
Planet(double mass, double radius) {
this.mass = mass;
this.radius = radius;
}
public double getMass() { return mass; }
public double getRadius() { return radius; }
// ثابت الجاذبية
static final double G = 6.67300E-11;
public double surfaceGravity() {
return G * mass / (radius * radius);
}
public double surfaceWeight(double otherMass) {
return otherMass * surfaceGravity();
}
}
// الاستخدام
double earthWeight = 75.0;
double mass = earthWeight / Planet.EARTH.surfaceGravity();
for (Planet p : Planet.values()) {
System.out.printf("الوزن على %s: %.2f N%n",
p.name(), p.surfaceWeight(mass));
}
Enum مع واجهة
JAVA
public interface Printable {
void print();
}
public enum Color implements Printable {
RED("أحمر"),
GREEN("أخضر"),
BLUE("أزرق");
private final String arabic;
Color(String arabic) {
this.arabic = arabic;
}
@Override
public void print() {
System.out.println("اللون: " + arabic);
}
}
الفئات الداخلية (Inner Classes)
فئة داخلية غير ثابتة
JAVA
public class OuterClass {
private int x = 10;
public class InnerClass {
public void display() {
System.out.println("x = " + x); // يمكن الوصول للمتغيرات الخارجية
}
}
}
// الاستخدام
OuterClass outer = new OuterClass();
OuterClass.InnerClass inner = outer.new InnerClass();
inner.display(); // x = 10
فئة داخلية ثابتة
JAVA
public class OuterClass {
private static int x = 10;
private int y = 20;
public static class StaticInnerClass {
public void display() {
System.out.println("x = " + x); // فقط المتغيرات الثابتة
// System.out.println("y = " + y); // ❌ خطأ
}
}
}
// الاستخدام
OuterClass.StaticInnerClass inner = new OuterClass.StaticInnerClass();
inner.display();
فئة محلية داخل دالة
JAVA
public class OuterClass {
public void myMethod() {
int localVar = 10;
class LocalClass {
public void display() {
System.out.println("المتغير المحلي: " + localVar);
}
}
LocalClass local = new LocalClass();
local.display();
}
}
فئة مجهلة (Anonymous Class)
JAVA
public interface Greeting {
void greet(String name);
}
public class Main {
public static void main(String[] args) {
// فئة مجهلة
Greeting arabic = new Greeting() {
@Override
public void greet(String name) {
System.out.println("مرحباً، " + name + "!");
}
};
// بـ Lambda (أبسط)
Greeting english = name -> System.out.println("Hello, " + name + "!");
arabic.greet("أحمد"); // مرحباً، أحمد!
english.greet("Ahmed"); // Hello, Ahmed!
}
}
❓ أسئلة شائعة
س متى أستخدم Enum بدلاً من الثوابت؟
ج استخدم Enum عندما تحتاج مجموعة محددة من القيم (مثل أيام الأسبوع، ألوان).
س ما الفرق بين Inner Class و Static Inner Class؟
ج Inner Class يمكنها الوصول للمتغيرات الخارجية. Static Inner Class لا يمكنها ذلك.
س هل الفئات المجهلة لا تزال مفيدة مع Lambda؟
ج Lambda أبسط للواجهات الوظيفية. الفئات المجهلة مفيدة للواجهات مع عدة دوال.
📖 ملخص
- Enum: نوع يحدد مجموعة ثابتة من الثوابت
- Enum يمكن أن يحتوي على متغيرات ودوال وواجهات
- Inner Class: فئة داخل فئة أخرى
- Static Inner Class: فئة داخلية ثابتة
- Local Class: فئة داخل دالة
- Anonymous Class: فئة بدون اسم
📝 تمارين
- شهور: أنشئ Enum للشهور مع عدد الأيام
- آلة حاسبة: أنشئ Enum للعمليات الحسابية
- فئات داخلية: أنشئ فئة مع فئات داخلية مختلفة
الدرس التالي
في الدرس التالي، سنتعلم الاستثناءات — معالجة الأخطاء في Java.



