0Pricing
Java Academy · درس

تعبيرات switch مع التعدادات

استخدم تعبيرات switch الحديثة مع enum لإنشاء تفرعات واضحة وشاملة

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

تعبيرات switch مع التعدادات

توفر تعبيرات switch (في Java 14 فأحدث) مع التعدادات توجيهًا موجزًا وشاملًا قائمًا على النوع. وعند تغطية جميع ثوابت التعداد، لا تكون هناك حاجة إلى default.

عبارة switch التقليدية

تعمل عبارة switch الكلاسيكية مع التعدادات، لكنها تتطلب break لمنع الانتقال التلقائي إلى الحالة التالية.

enum Severity { LOW, MEDIUM, HIGH, CRITICAL }

Severity s = Severity.HIGH;
String action;
switch (s) {
    case LOW:
        action = "Log and monitor";
        break;
    case MEDIUM:
        action = "Notify on-call team";
        break;
    case HIGH:
        action = "Page engineer immediately";
        break;
    case CRITICAL:
        action = "Activate incident response";
        break;
    default:
        action = "Unknown";
}
System.out.println(action); // Page engineer immediately

تعبير switch مع التسميات السهمية

تلغي تعبيرات switch ذات التسميات السهمية الانتقال التلقائي وbreak. فهي تُقيّم إلى قيمة وتتطلب تغطية جميع الحالات.

enum Severity { LOW, MEDIUM, HIGH, CRITICAL }

Severity s = Severity.HIGH;
String action = switch (s) {
    case LOW      -> "Log and monitor";
    case MEDIUM   -> "Notify on-call team";
    case HIGH     -> "Page engineer immediately";
    case CRITICAL -> "Activate incident response";
    // no default needed — all cases covered
};
System.out.println(action); // Page engineer immediately

تعبير switch مع الكتل

عندما يتطلب منطق الحالة عدة عبارات، استخدم كتلة مع yield لإنتاج قيمة النتيجة.

enum DayOfWeek { MON, TUE, WED, THU, FRI, SAT, SUN }

DayOfWeek day = DayOfWeek.FRI;
int hoursOpen = switch (day) {
    case MON, TUE, WED, THU -> 8;
    case FRI -> {
        System.out.println("Half day on Friday!");
        yield 4;  // yield returns value from block
    }
    case SAT, SUN -> 0;
};
System.out.println("Hours open: " + hoursOpen); // Hours open: 4

تجميع حالات متعددة

يمكن لثوابت enum متعددة مشاركة الحالة نفسها عند الفصل بينها بفواصل.

enum Season { SPRING, SUMMER, FALL, WINTER }

Season season = Season.SUMMER;
String activity = switch (season) {
    case SPRING, FALL -> "Hike in the mountains";
    case SUMMER       -> "Beach vacation";
    case WINTER       -> "Ski at the resort";
};
System.out.println(activity); // Beach vacation

الإرجاع من الدوال باستخدام switch

تُعد تعبيرات switch مناسبة جدًا لاستخدامها كعبارات إرجاع في الدوال، إذ تجعل الغرض واضحًا.

enum Priority { LOW, NORMAL, HIGH, URGENT }

static int getSlaHours(Priority p) {
    return switch (p) {
        case LOW    -> 72;
        case NORMAL -> 24;
        case HIGH   -> 4;
        case URGENT -> 1;
    };
}

System.out.println(getSlaHours(Priority.URGENT)); // 1
System.out.println(getSlaHours(Priority.LOW));    // 72

تعبير switch ضمن stream

يمكن استخدام تعبيرات switch داخل عمليات stream لإجراء تحويلات نظيفة لكل عنصر.

import java.util.*;
import java.util.stream.*;

enum Status { PENDING, ACTIVE, CLOSED }

record Account(String id, Status status) {}

List<Account> accounts = List.of(
    new Account("A1", Status.ACTIVE),
    new Account("A2", Status.PENDING),
    new Account("A3", Status.CLOSED)
);

accounts.stream()
    .map(a -> a.id() + ": " + switch (a.status()) {
        case ACTIVE  -> "\u2705 Live";
        case PENDING -> "\u23f3 Awaiting activation";
        case CLOSED  -> "\u274c Deactivated";
    })
    .forEach(System.out::println);

اكتمال التغطية وقت الترجمة

يفرض المصرّف تغطية جميع ثوابت enum. وتؤدي إضافة ثابت جديد إلى enum إلى حدوث أخطاء في الترجمة في جميع تعبيرات switch التي لا تتعامل معه.

enum Color { RED, GREEN, BLUE }  // add YELLOW here → compile error below

Color c = Color.GREEN;
// This switch is exhaustive for RED, GREEN, BLUE
// If you add YELLOW to the enum without adding a case here,
// the compiler will report an error.
String hex = switch (c) {
    case RED   -> "#FF0000";
    case GREEN -> "#00FF00";
    case BLUE  -> "#0000FF";
};
System.out.println(hex); // #00FF00

استخدام default في switch للأمان

عند استخدام عبارة switch، وليس تعبيرًا، أو عندما يغطي switch بعض الحالات فقط عن قصد، أضيفوا حالة default.

enum Feature { DARK_MODE, PUSH_NOTIFICATIONS, ANALYTICS, BETA_FEATURE }

static boolean isEnabled(Feature feature) {
    return switch (feature) {
        case DARK_MODE, PUSH_NOTIFICATIONS -> true;
        case ANALYTICS                     -> false;
        default -> {
            System.out.println("Unknown feature: " + feature);
            yield false;
        }
    };
}
System.out.println(isEnabled(Feature.DARK_MODE));     // true
System.out.println(isEnabled(Feature.BETA_FEATURE));  // false

تطبيق عملي: دورة حياة الطلب

آلة حالات كاملة لدورة حياة الطلب، تستخدم تعبير switch لتحديد الانتقالات المسموح بها.

enum OrderState { CART, PENDING, CONFIRMED, SHIPPED, DELIVERED, CANCELLED }

static Set<OrderState> allowedTransitions(OrderState from) {
    return switch (from) {
        case CART      -> Set.of(OrderState.PENDING, OrderState.CANCELLED);
        case PENDING   -> Set.of(OrderState.CONFIRMED, OrderState.CANCELLED);
        case CONFIRMED -> Set.of(OrderState.SHIPPED);
        case SHIPPED   -> Set.of(OrderState.DELIVERED);
        case DELIVERED, CANCELLED -> Set.of(); // terminal states
    };
}
System.out.println(allowedTransitions(OrderState.PENDING));
// [CONFIRMED, CANCELLED]

switch على String مقارنةً بـ Enum

يتطلب استخدام switch على String التحقق من null، كما أنه يميّز بين حالة الأحرف. أما استخدام switch على enum فهو آمن فيما يتعلق بالأنواع، لكنه يؤدي إلى NPE إذا كانت القيمة null؛ لذلك يُفضّل استخدام enum عندما تكون مجموعة القيم معروفة.

// String switch — fragile
String role = "admin";
String label = switch (role.toLowerCase()) {
    case "admin" -> "Administrator";
    case "guest" -> "Guest User";
    default      -> "Unknown";
};

// Enum switch — type-safe
enum Role { ADMIN, GUEST }
Role r = Role.ADMIN;
String label2 = switch (r) {
    case ADMIN -> "Administrator";
    case GUEST -> "Guest User";
};
System.out.println(label2); // Administrator

اختبار سريع

لديكم enum يحتوي على 4 ثوابت، وكتبتم تعبير switch يغطي الثوابت الأربعة كلها. ماذا يحدث إذا أضفتم ثابتًا خامسًا إلى enum؟

مراجعة: تعبيرات switch مع enum

أهم النقاط:

  • تعبيرات switch ذات تسميات الأسهم تلغي الحاجة إلى break والانتقال التلقائي بين الحالات
  • استخدموا yield لإرجاع قيمة من حالة كتلية
  • اجمعوا الثوابت المتعددة باستخدام الفواصل: case A, B ->
  • لا تتطلب تعبيرات switch المكتملة حالة default عند تغطية جميع الثوابت
  • تؤدي إضافة ثابت جديد إلى enum إلى حدوث أخطاء في الترجمة في تعبيرات switch المكتملة
  • تُعد تعبيرات switch مناسبة جدًا في عمليات map() على stream

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

هل درس «تعبيرات switch مع التعدادات» مجاني؟

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

ماذا ستتعلم في «تعبيرات switch مع التعدادات»؟

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

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

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

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

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

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

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

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

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