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 أبسط للواجهات الوظيفية. الفئات المجهلة مفيدة للواجهات مع عدة دوال.

📖 ملخص

📝 تمارين

  1. شهور: أنشئ Enum للشهور مع عدد الأيام
  2. آلة حاسبة: أنشئ Enum للعمليات الحسابية
  3. فئات داخلية: أنشئ فئة مع فئات داخلية مختلفة

الدرس التالي

في الدرس التالي، سنتعلم الاستثناءات — معالجة الأخطاء في Java.

100%