0Pricing
Java Academy · درس

التعدادات ذات الحقول والأساليب

أضف الحقول والمنشئات والأساليب إلى enum لتغليف السلوك

التعدادات ذات الحقول والأساليب درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.

التعدادات مع الحقول والأساليب

يمكن لثوابت التعداد حمل بيانات. أضف الحقول من خلال التصريح عنها وإضافة مُنشئ. ويكون المُنشئ خاصًا تلقائيًا.

التصريح عن الحقول في التعدادات

يستدعي كل ثابت في التعداد المُنشئ عند تحميل الفئة. وتُعيَّن قيم الحقول مرة واحدة، وتكون غير قابلة للتغيير عند التصريح عنها باستخدام final.

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;    // kilograms
    private final double radius;  // meters

    Planet(double mass, double radius) {
        this.mass = mass;
        this.radius = radius;
    }

    public double mass()   { return mass; }
    public double radius() { return radius; }
}

إضافة أساليب إلى التعدادات

يمكن أن تحتوي أنواع التعدادات على أي أساليب تضعها في فئة، بما في ذلك الخصائص المحسوبة.

enum Planet {
    EARTH(5.976e+24, 6.37814e6);
    // ... constructor and fields ...
    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("Weight on %s: %.2f%n", p, p.surfaceWeight(mass));

الأساليب المجردة في ثوابت التعداد

يمكن لكل ثابت توفير تنفيذه الخاص لأسلوب مجرد مُصرَّح عنه في جسم التعداد.

enum Operation {
    PLUS  { public double apply(double x, double y) { return x + y; } },
    MINUS { public double apply(double x, double y) { return x - y; } },
    TIMES { public double apply(double x, double y) { return x * y; } },
    DIVIDE{ public double apply(double x, double y) { return x / y; } };

    public abstract double apply(double x, double y);
}

System.out.println(Operation.PLUS.apply(3, 4));   // 7.0
System.out.println(Operation.TIMES.apply(3, 4));  // 12.0

تعدادات ذات تسميات نصية

نمط شائع: امنح كل ثابت تسمية سهلة القراءة للمستخدم وخزّنها في حقل.

enum UserRole {
    GUEST("Guest User"),
    MEMBER("Registered Member"),
    ADMIN("Administrator"),
    SUPERADMIN("Super Administrator");

    private final String label;

    UserRole(String label) { this.label = label; }

    public String label() { return label; }

    public static UserRole fromLabel(String lbl) {
        for (UserRole r : values())
            if (r.label.equalsIgnoreCase(lbl)) return r;
        throw new IllegalArgumentException(lbl);
    }
}

System.out.println(UserRole.ADMIN.label()); // Administrator

تعداد متعدد الحقول

يمكن أن تحتوي التعدادات على العدد الذي تحتاج إليه من الحقول. يخزّن تعداد العملة هنا كلًا من رمز ISO والرمز.

enum Currency {
    USD("US Dollar", "$"),
    EUR("Euro", "\u20ac"),
    GBP("British Pound", "\u00a3"),
    JPY("Japanese Yen", "\u00a5");

    public final String name;
    public final String symbol;

    Currency(String name, String symbol) {
        this.name = name;
        this.symbol = symbol;
    }

    public String format(double amount) {
        return String.format("%s%.2f", symbol, amount);
    }
}

System.out.println(Currency.EUR.format(99.99)); // \u20ac99.99

تجاوز toString()

تجاوز toString() في التعداد لإعادة تمثيل نصي مخصص بدلًا من اسم الثابت.

enum HttpMethod {
    GET, POST, PUT, PATCH, DELETE;

    @Override
    public String toString() {
        return name().toUpperCase();
    }

    public boolean hasBody() {
        return this == POST || this == PUT || this == PATCH;
    }
}

HttpMethod m = HttpMethod.POST;
System.out.println(m);            // POST
System.out.println(m.hasBody());  // true
System.out.println(HttpMethod.GET.hasBody()); // false

تعداد مع التحقق

يمكن لمنشئات التعداد التحقق من الوسائط لمنع الحالات غير الصالحة.

enum DiscountTier {
    BRONZE(5), SILVER(10), GOLD(20), PLATINUM(30);

    public final int percentage;

    DiscountTier(int percentage) {
        if (percentage < 0 || percentage > 100)
            throw new IllegalArgumentException("Invalid: " + percentage);
        this.percentage = percentage;
    }

    public double apply(double price) {
        return price * (1 - percentage / 100.0);
    }
}

System.out.println(DiscountTier.GOLD.apply(100.0)); // 80.0

نمط Singleton باستخدام تعداد

يُعد التعداد ذو الثابت الواحد الطريقة الأكثر أمانًا لتنفيذ Singleton في Java؛ فهو آمن عند إجراء التسلسل وآمن مع الخيوط تلقائيًا.

enum AppConfig {
    INSTANCE;

    private String dbUrl = "jdbc:postgresql://localhost/mydb";
    private int maxConnections = 20;

    public String getDbUrl() { return dbUrl; }
    public int getMaxConnections() { return maxConnections; }

    public void setDbUrl(String url) { this.dbUrl = url; }
}

// Access the singleton
AppConfig config = AppConfig.INSTANCE;
System.out.println(config.getDbUrl());

التعدادات في نماذج المجال

تُستخدم التعدادات على نطاق واسع في نماذج المجال لتمثيل فئات آمنة من حيث النوع، مثل حالة الطلب وطريقة الدفع ونوع الإشعار وغير ذلك.

enum PaymentMethod {
    CREDIT_CARD("Credit Card", true),
    DEBIT_CARD("Debit Card", true),
    PAYPAL("PayPal", false),
    CRYPTO("Cryptocurrency", false),
    BANK_TRANSFER("Bank Transfer", false);

    public final String displayName;
    public final boolean instantCharge;

    PaymentMethod(String displayName, boolean instantCharge) {
        this.displayName = displayName;
        this.instantCharge = instantCharge;
    }
}

حقل التعداد مقابل القيمة المحسوبة

تخزّن الحقول بيانات ثابتة، بينما تحسب الأساليب قيمًا ديناميكية. استخدم الحقول للبيانات الثابتة، والأساليب للقيم المشتقة.

enum DayType {
    MONDAY(false), TUESDAY(false), WEDNESDAY(false),
    THURSDAY(false), FRIDAY(false),
    SATURDAY(true), SUNDAY(true);

    private final boolean weekend;
    DayType(boolean weekend) { this.weekend = weekend; }

    public boolean isWeekend()  { return weekend; }
    public boolean isWeekday()  { return !weekend; }

    public static long weekdayCount() {
        return java.util.Arrays.stream(values())
            .filter(DayType::isWeekday).count();
    }
}
System.out.println(DayType.weekdayCount()); // 5

تحقق سريع

كيف يختلف مُنشئ التعداد عن مُنشئ الفئة العادي؟

مراجعة: التعدادات مع الحقول والأساليب

أهم النقاط:

  • أضف الحقول ومُنشئًا لحمل بيانات خاصة بكل ثابت
  • تكون منشئات التعدادات خاصة ضمنيًا
  • تتيح الأساليب المجردة لكل ثابت توفير تنفيذه الخاص
  • تجاوز toString() لتخصيص أسماء العرض
  • تُعد التعدادات ذات الثابت الواحد أفضل طريقة لتنفيذ Singleton
  • تندمج التعدادات طبيعيًا في نماذج المجال بوصفها فئات آمنة من حيث النوع

الأسئلة الشائعة

هل درس «التعدادات ذات الحقول والأساليب» مجاني؟

نعم — نص درس «التعدادات ذات الحقول والأساليب» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.

ماذا ستتعلم في «التعدادات ذات الحقول والأساليب»؟

أضف الحقول والمنشئات والأساليب إلى enum لتغليف السلوك تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟

لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «التعدادات ذات الحقول والأساليب»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟

نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. تعريف التعدادات واستخدامها
  2. التعدادات ذات الحقول والأساليب
  3. تعبيرات switch مع التعدادات
  4. EnumSet وEnumMap
← العودة إلى Java Academy