التبديل الشامل على نوع مختوم
اكتمال وقت الترجمة
التبديل الشامل على نوع مختوم درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.
switch شامل
عند استخدام switch مع نوع sealed، يعرف المصرّف كل الأنواع الفرعية المسموح بها. وإذا غطّى switch جميع هذه الأنواع، فإنه يكون شاملًا ولا تحتاج إلى فرع افتراضي.
switch بنمط النوع
يمكن لتعبيرات switch المطابقة حسب نوع القيمة وقت التشغيل باستخدام أنماط الأنواع.
public class Main {
sealed interface Shape permits Circle, Square {}
record Circle(double radius) implements Shape {}
record Square(double side) implements Shape {}
static String describe(Shape s) {
return switch (s) {
case Circle c -> "circle r=" + c.radius();
case Square sq -> "square s=" + sq.side();
};
}
public static void main(String[] args) {
System.out.println(describe(new Circle(2)));
System.out.println(describe(new Square(3)));
}
}لا حاجة إلى default
بما أن Circle وSquare هما النوعان الفرعيان الوحيدان المسموح بهما، يقبل المصرّف switch باعتباره مكتملًا. وستكون إضافة default زائدة.
الاكتمال في وقت التصريف
إذا أضفت نوعًا فرعيًا مسموحًا به جديدًا لاحقًا ونسيت معالجته، فسيفشل كل switch شامل في التصريف. ويحوّل ذلك فئةً كاملةً من أخطاء وقت التشغيل إلى أخطاء تصريف.
حساب نتيجة
تُعدّ تعبيرات switch الشاملة مناسبةً جدًا لتحويل قيمة إلى نتيجة، مثل المساحة.
public class Main {
sealed interface Shape permits Circle, Square {}
record Circle(double radius) implements Shape {}
record Square(double side) implements Shape {}
static double area(Shape s) {
return switch (s) {
case Circle c -> Math.PI * c.radius() * c.radius();
case Square sq -> sq.side() * sq.side();
};
}
public static void main(String[] args) {
System.out.printf("%.2f%n", area(new Circle(1)));
System.out.printf("%.2f%n", area(new Square(2)));
}
}عبارات switch مقابل تعبيراته
ينطبق الاكتمال على تعبيرات switch (أي التي تنتج قيمة)، وعلى عبارات switch التي تستخدم صيغة السهم مع نوع sealed. ويفرض المصرّف تغطية جميع الحالات.
معالجة null
افتراضيًا، يؤدي استخدام switch مع مرجع إلى طرح NullPointerException إذا كانت القيمة null. ويمكنك إضافة تسمية case null لمعالجتها صراحةً.
public class Main {
sealed interface Shape permits Circle, Square {}
record Circle(double radius) implements Shape {}
record Square(double side) implements Shape {}
static String describe(Shape s) {
return switch (s) {
case null -> "no shape";
case Circle c -> "circle";
case Square sq -> "square";
};
}
public static void main(String[] args) {
System.out.println(describe(null));
System.out.println(describe(new Circle(1)));
}
}لا تخلّ الحواجز بالاكتمال
يمكنك إضافة حواجز when لتحسين الحالات، لكن الحالة المقيّدة بحاجز وحده لا تجعل النوع مغطى. ولا يزال يتعين عليك توفير حالة غير مقيّدة لكل نوع فرعي للحفاظ على الاكتمال.
public class Main {
sealed interface Shape permits Circle, Square {}
record Circle(double radius) implements Shape {}
record Square(double side) implements Shape {}
static String size(Shape s) {
return switch (s) {
case Circle c when c.radius() > 10 -> "big circle";
case Circle c -> "small circle";
case Square sq -> "square";
};
}
public static void main(String[] args) {
System.out.println(size(new Circle(20)));
System.out.println(size(new Circle(2)));
}
}استخدام switch مع فئة sealed
يعمل الاكتمال نفسه مع الفئات sealed، وليس مع الواجهات فقط.
public class Main {
sealed static abstract class Token permits Word, Number {}
static final class Word extends Token { final String text; Word(String t){text=t;} }
static final class Number extends Token { final int value; Number(int v){value=v;} }
static String show(Token t) {
return switch (t) {
case Word w -> "word:" + w.text;
case Number n -> "num:" + n.value;
};
}
public static void main(String[] args) {
System.out.println(show(new Word("hi")));
System.out.println(show(new Number(7)));
}
}سبب قوة هذا الأسلوب
يمنحك الجمع بين switch الشامل والأنواع sealed كودًا آمنًا قابلًا للتطوير. فتكون مجموعة الحالات موثقةً في مكان واحد، ويضمن المصرّف عدم إغفال أي حالة عند توسعة النموذج.
مثال مكتمل
يُحوَّل هنا نوع نتيجة sealed إلى رسالة مع تغطية كاملة لجميع الحالات.
public class Main {
sealed interface Result permits Ok, Err {}
record Ok(int value) implements Result {}
record Err(String message) implements Result {}
static String render(Result r) {
return switch (r) {
case Ok ok -> "value = " + ok.value();
case Err err -> "error: " + err.message();
};
}
public static void main(String[] args) {
System.out.println(render(new Ok(10)));
System.out.println(render(new Err("bad input")));
}
}تحقق سريع
اختبر مدى فهمك لـ switch الشامل.
مراجعة
تعلّمت استخدام switch الشامل مع الأنواع sealed.
- تجعل تغطية جميع الأنواع الفرعية المسموح بها switch شاملًا، ولذلك لا حاجة إلى
default. - يصبح نسيان نوع فرعي جديد خطأً في التصريف.
- تعالج
case nullالقيم null صراحةً. - تحسّن الحواجز الحالة، لكنها لا تحل محل الحالة غير المقيّدة.
الأسئلة الشائعة
هل درس «التبديل الشامل على نوع مختوم» مجاني؟
نعم — نص درس «التبديل الشامل على نوع مختوم» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.
ماذا ستتعلم في «التبديل الشامل على نوع مختوم»؟
اكتمال وقت الترجمة تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟
لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «التبديل الشامل على نوع مختوم»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟
نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- التصريح بالأنواع المختومة
- جملة permits
- الأنواع المختومة مع Records
- التبديل الشامل على نوع مختوم