0Pricing
Java Academy · درس

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

إضافة سلوك إلى Enums

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

التعدادات فئات كاملة

إن enum في Java أكثر بكثير من مجرد قائمة بالثوابت. فهو فئة حقيقية تكون مثيلاتها هي الثوابت.

وهذا يعني أن التعدادات يمكن أن تحتوي على حقول ومنشئات وطرق مثل أي فئة أخرى.

public class Main {
    enum Direction { NORTH, SOUTH, EAST, WEST }
    public static void main(String[] args) {
        Direction d = Direction.NORTH;
        System.out.println(d + " is a " + d.getClass().getSuperclass().getSimpleName());
    }
}

إضافة حقل

يمكنك إرفاق بيانات بكل ثابت. صرّح عن حقل final ومنشئ، ثم مرّر القيم بين قوسين بعد كل ثابت.

public class Main {
    enum Planet {
        EARTH(9.81), MARS(3.71), JUPITER(24.79);
        private final double gravity;
        Planet(double gravity) { this.gravity = gravity; }
        double gravity() { return gravity; }
    }
    public static void main(String[] args) {
        System.out.println("Mars gravity: " + Planet.MARS.gravity());
    }
}

منشئ التعداد خاص

تكون منشئات التعداد خاصة ضمنيًا. لا يمكنك استدعاء new على تعداد؛ إذ ينشئ JVM الثوابت مرة واحدة عند تحميل الفئة.

وهذا يضمن وجود مجموعة ثابتة ومحدودة من المثيلات.

public class Main {
    enum Coin {
        PENNY(1), NICKEL(5), DIME(10), QUARTER(25);
        private final int cents;
        Coin(int cents) { this.cents = cents; }
        int cents() { return cents; }
    }
    public static void main(String[] args) {
        int total = Coin.QUARTER.cents() + Coin.DIME.cents();
        System.out.println("Total cents: " + total);
    }
}

حقول متعددة

يمكن للثابت أن يحمل عدة أجزاء من البيانات. يخزّن كل كوكب هنا كتلته ونصف قطره.

public class Main {
    enum Planet {
        EARTH(5.976e24, 6.37814e6),
        MARS(6.421e23, 3.3972e6);
        private final double mass, radius;
        Planet(double mass, double radius) { this.mass = mass; this.radius = radius; }
        double surfaceGravity() {
            final double G = 6.67300E-11;
            return G * mass / (radius * radius);
        }
    }
    public static void main(String[] args) {
        System.out.printf("Earth g = %.2f%n", Planet.EARTH.surfaceGravity());
    }
}

طرق المثيلات

يمكن لطرق التعداد حساب نتائج من حقول الثابت نفسه، تمامًا مثل طرق المثيلات العادية.

public class Main {
    enum Size {
        SMALL(8), MEDIUM(12), LARGE(16);
        private final int ounces;
        Size(int ounces) { this.ounces = ounces; }
        int ounces() { return ounces; }
        double liters() { return ounces * 0.0295735; }
    }
    public static void main(String[] args) {
        System.out.printf("Large = %.2f L%n", Size.LARGE.liters());
    }
}

الاسم المضمّن والرقم الترتيبي

يحصل كل تعداد على name() (المعرّف الدقيق) وordinal() (موضعه الذي يبدأ من الصفر).

يُفضَّل تخزين بياناتكم الخاصة بدلًا من الاعتماد على ordinal()، إذ يتسبب ذلك في مشكلات عند إعادة ترتيب الثوابت.

public class Main {
    enum Day { MON, TUE, WED }
    public static void main(String[] args) {
        for (Day d : Day.values()) {
            System.out.println(d.name() + " -> ordinal " + d.ordinal());
        }
    }
}

values و valueOf

ينشئ المصرّف مساعدَين static:

  • تعيد values() مصفوفة تحتوي على جميع الثوابت.
  • تبحث valueOf(String) عن ثابت حسب اسمه، وتطلق استثناءً إذا لم تجده.
public class Main {
    enum Status { ACTIVE, PAUSED, CLOSED }
    public static void main(String[] args) {
        System.out.println("count: " + Status.values().length);
        Status s = Status.valueOf("PAUSED");
        System.out.println("parsed: " + s);
    }
}

تجاوز toString

يمكنكم تجاوز toString() لمنح الثوابت تسميات أوضح للمستخدم، مع الاحتفاظ باسم الثابت في الشيفرة.

public class Main {
    enum Priority {
        LOW, MEDIUM, HIGH;
        @Override public String toString() {
            return name().charAt(0) + name().substring(1).toLowerCase();
        }
    }
    public static void main(String[] args) {
        for (Priority p : Priority.values()) System.out.println(p);
    }
}

التعدادات في switch

تعمل التعدادات بسلاسة مع switch. وتوفر تعبيرات switch الحديثة فحوصًا لاكتمال الحالات، كما تمنع الانتقال التلقائي بين الحالات.

public class Main {
    enum Traffic { RED, YELLOW, GREEN }
    static String action(Traffic t) {
        return switch (t) {
            case RED -> "Stop";
            case YELLOW -> "Slow down";
            case GREEN -> "Go";
        };
    }
    public static void main(String[] args) {
        System.out.println(action(Traffic.GREEN));
    }
}

خرائط البحث الثابتة

من الأنماط الشائعة إنشاء خريطة static تربط حقلًا بالثابت المقابل له، وتُبنى مرة واحدة داخل static initializer.

import java.util.HashMap;
import java.util.Map;

public class Main {
    enum Op {
        PLUS("+"), MINUS("-");
        private final String symbol;
        Op(String symbol) { this.symbol = symbol; }
        private static final Map<String, Op> BY_SYMBOL = new HashMap<>();
        static { for (Op o : values()) BY_SYMBOL.put(o.symbol, o); }
        static Op fromSymbol(String s) { return BY_SYMBOL.get(s); }
    }
    public static void main(String[] args) {
        System.out.println(Op.fromSymbol("-"));
    }
}

التعدادات تنفّذ الواجهات

يمكن للتعداد تنفيذ واجهة، مما يتيح للثوابت الاندماج في شيفرة عامة الغرض.

public class Main {
    interface Describable { String describe(); }
    enum Animal implements Describable {
        DOG, CAT;
        public String describe() { return "A " + name().toLowerCase(); }
    }
    public static void main(String[] args) {
        Describable d = Animal.DOG;
        System.out.println(d.describe());
    }
}

تحقق سريع

اختبروا فهمكم لحقول التعدادات.

مراجعة

تعلّمتم أن التعدادات فئات كاملة:

  • يمكن للثوابت الاحتفاظ بـ حقول تُضبط عبر مُنشئ خاص.
  • يمكن أن تحتوي التعدادات على دوال مثيل وأن تتجاوز toString().
  • تُنشأ لكم الدالتان values() وvalueOf() تلقائيًا.
  • يمكن للتعدادات تنفيذ الواجهات، ويُفضَّل استخدام الحقول بدلًا من ordinal().

التالي هو السلوك الخاص بكل ثابت باستخدام الدوال المجرّدة.

public class Main {
    enum Greeting { HELLO; String text() { return "Hi"; } }
    public static void main(String[] args) {
        System.out.println("Enum fields recap: " + Greeting.HELLO.text());
    }
}

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

هل درس «Enums مع الحقول والدوال» مجاني؟

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

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

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

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

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

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

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

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

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

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

  1. Enums مع الحقول والدوال
  2. الدوال المجرّدة في Enums
  3. EnumSet
  4. EnumMap
← العودة إلى Java Academy