0Pricing
Java Academy · درس

تعريف التعدادات واستخدامها

صرّح بأنواع enum، واستخدم ثوابتها، وتكرّر عليها باستخدام values() وordinal()

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

تعريف التعدادات واستخدامها

إن enum (التعداد) فئة خاصة تمثل مجموعة ثابتة من الثوابت. تتميز التعدادات بأمان الأنواع وسهولة القراءة، كما أنها أقوى من ثوابت static int.

التصريح عن تعداد

استخدم الكلمة المفتاحية enum للتصريح عن تعداد. كل ثابت هو ضمنيًا public static final، وهو مثيل من نوع التعداد.

enum Day {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY,
    FRIDAY, SATURDAY, SUNDAY
}

Day today = Day.WEDNESDAY;
System.out.println(today);          // WEDNESDAY
System.out.println(today.name());   // WEDNESDAY
System.out.println(today.ordinal()); // 2 (zero-based index)

التكرار باستخدام values()

تعيد EnumType.values() جميع الثوابت بترتيب التصريح عنها. استخدمها للتكرار أو لإنشاء القوائم.

enum Planet { MERCURY, VENUS, EARTH, MARS, JUPITER, SATURN, URANUS, NEPTUNE }

for (Planet p : Planet.values()) {
    System.out.println(p.ordinal() + ": " + p);
}
// 0: MERCURY
// 1: VENUS
// 2: EARTH
// ...

// Count constants
System.out.println(Planet.values().length); // 8

valueOf() والتحليل

تحوّل Enum.valueOf(name) قيمة String إلى الثابت المطابق. وتطرح IllegalArgumentException إذا لم يُعثر على تطابق.

enum Status { PENDING, ACTIVE, SUSPENDED, CLOSED }

String input = "ACTIVE";
Status s = Status.valueOf(input);
System.out.println(s); // ACTIVE

try {
    Status bad = Status.valueOf("UNKNOWN");
} catch (IllegalArgumentException e) {
    System.out.println("Invalid status: UNKNOWN");
}

// Safe parse pattern
static Status safeFrom(String name) {
    try { return Status.valueOf(name.toUpperCase()); }
    catch (IllegalArgumentException e) { return Status.PENDING; }
}

استخدام التعدادات في switch

تعمل التعدادات جيدًا جدًا في عبارات وتعبيرات switch. وتجعل تعبيرات switch الحديثة توجيه التعدادات موجزًا وشاملًا لجميع الحالات.

enum OrderStatus { CREATED, PROCESSING, SHIPPED, DELIVERED, CANCELLED }

OrderStatus status = OrderStatus.SHIPPED;

String message = switch (status) {
    case CREATED     -> "Order received, awaiting payment";
    case PROCESSING  -> "Payment confirmed, preparing shipment";
    case SHIPPED     -> "On the way — track your package";
    case DELIVERED   -> "Delivered! Enjoy your order";
    case CANCELLED   -> "Order cancelled";
};
System.out.println(message); // On the way — track your package

التعدادات مع if/else

استخدم == لمقارنة ثوابت التعداد؛ فهي مثيلات مفردة، لذا تعمل مساواة المراجع بصورة صحيحة.

enum UserRole { GUEST, MEMBER, ADMIN, SUPERADMIN }

UserRole role = UserRole.ADMIN;

if (role == UserRole.ADMIN || role == UserRole.SUPERADMIN) {
    System.out.println("Access granted to admin panel");
} else {
    System.out.println("Access denied");
}

// Enum comparison: never use .equals() for enums
// == is correct and more readable

التعدادات في Collections

يمكن تخزين التعدادات في مجموعات قياسية. استخدم EnumSet وEnumMap لتخزين يعتمد على التعدادات بأداء عالٍ، وسيُشرح ذلك في درس لاحق.

import java.util.*;

enum Permission { READ, WRITE, DELETE, ADMIN }

Set<Permission> userPerms = new HashSet<>();
userPerms.add(Permission.READ);
userPerms.add(Permission.WRITE);

System.out.println(userPerms.contains(Permission.DELETE)); // false
System.out.println(userPerms.contains(Permission.READ));   // true

List<Permission> allPerms = Arrays.asList(Permission.values());
System.out.println(allPerms.size()); // 4

التعدادات وتطبيق Interfaces

يمكن للتعدادات تطبيق الواجهات، مما يتيح لك إرفاق سلوك بكل ثابت أو تعريف عقد مشترك لجميع الثوابت.

interface Describable {
    String describe();
}

enum Season implements Describable {
    SPRING, SUMMER, FALL, WINTER;

    public String describe() {
        return switch (this) {
            case SPRING -> "Mild and rainy";
            case SUMMER -> "Hot and sunny";
            case FALL   -> "Cool with falling leaves";
            case WINTER -> "Cold and snowy";
        };
    }
}

for (Season s : Season.values()) {
    System.out.println(s + ": " + s.describe());
}

التعداد بوصفه آلة حالات

تتناسب التعدادات طبيعيًا مع آلات الحالات. يمثل كل ثابت حالة، وتحدد الأساليب الانتقالات الصالحة.

enum TrafficLight {
    RED, YELLOW, GREEN;

    public TrafficLight next() {
        return switch (this) {
            case RED    -> GREEN;
            case GREEN  -> YELLOW;
            case YELLOW -> RED;
        };
    }
}

TrafficLight light = TrafficLight.RED;
for (int i = 0; i < 6; i++) {
    System.out.println(light);
    light = light.next();
}
// RED, GREEN, YELLOW, RED, GREEN, YELLOW

أفضل ممارسات التعدادات

اتبع أفضل الممارسات التالية عند استخدام التعدادات:

  • استخدم أسماء من النمط ALL_CAPS للثوابت، وفقًا للعرف المتبع
  • فضّل التعدادات على ثوابت int أو String لضمان أمان الأنواع
  • استخدم تعبيرات switch للتوجيه الشامل لجميع الحالات
  • أضف حقولًا وأساليب إلى التعدادات عندما تحمل الثوابت بيانات

تطبيقي: رموز حالة HTTP

تعداد واقعي لنمذجة فئات حالات HTTP، مع أسلوب مُنشئ يستقبل الرمز الرقمي.

enum HttpStatus {
    OK(200), CREATED(201), BAD_REQUEST(400),
    UNAUTHORIZED(401), NOT_FOUND(404), SERVER_ERROR(500);

    public final int code;

    HttpStatus(int code) { this.code = code; }

    public static HttpStatus from(int code) {
        for (HttpStatus s : values())
            if (s.code == code) return s;
        throw new IllegalArgumentException("Unknown HTTP code: " + code);
    }

    public boolean isSuccess() { return code >= 200 && code < 300; }
}

HttpStatus s = HttpStatus.from(404);
System.out.println(s + " (" + s.code + ") success=" + s.isSuccess());
// NOT_FOUND (404) success=false

تحقق سريع

ما ناتج الشيفرة التالية؟

enum Color { RED, GREEN, BLUE }
System.out.println(Color.GREEN.ordinal());

مراجعة: تعريف التعدادات واستخدامها

أهم النقاط:

  • تعرّف التعدادات مجموعة ثابتة من الثوابت المسماة مع ضمان أمان الأنواع
  • يكرّر values() جميع الثوابت، بينما يعطي ordinal() الفهرس الذي يبدأ من الصفر
  • تحوّل valueOf() قيمة String إلى الثابت المطابق
  • استخدم ==، وليس equals، لمقارنة مثيلات التعداد
  • تعمل التعدادات جيدًا في تعبيرات switch للتوجيه الشامل لجميع الحالات
  • يمكن للتعدادات تطبيق الواجهات لإرفاق سلوك بكل ثابت

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

هل درس «تعريف التعدادات واستخدامها» مجاني؟

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

ماذا ستتعلم في «تعريف التعدادات واستخدامها»؟

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

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

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

كم من الوقت يستغرق درس «تعريف التعدادات واستخدامها»؟

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

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

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

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

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