الأنماط في switch
دمج الأنواع المختومة والأنماط
الأنماط في switch درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.
الأنماط في switch
تطور switch من مطابقة الثوابت إلى مطابقة الأنماط. وبدمجه مع الأنواع المختومة والسجلات، يستطيع switch التوزيع حسب النوع، وفك بنية البيانات، وضمان اكتمال الحالات.
أنماط الأنواع في switch
يمكن أن تكون كل حالة نمط نوع، فتسند متغيرًا ذا نوع محدد لهذا الفرع.
public class Main {
static String kind(Object o) {
return switch (o) {
case Integer i -> "int " + i;
case String s -> "string " + s;
default -> "other";
};
}
public static void main(String[] args) {
System.out.println(kind(42));
System.out.println(kind("hi"));
System.out.println(kind(3.14));
}
}لا تحتاج الأنواع المختومة إلى default
عندما يكون المحدِّد نوعًا مختومًا وتغطون كل الأنواع الفرعية المسموح بها، يكون switch شاملًا لجميع الحالات من دون default.
public class Main {
sealed interface Shape permits Circle, Square {}
record Circle(double r) implements Shape {}
record Square(double s) implements Shape {}
static double area(Shape shape) {
return switch (shape) {
case Circle c -> Math.PI * c.r() * c.r();
case Square sq -> sq.s() * sq.s();
};
}
public static void main(String[] args) {
System.out.printf("%.2f%n", area(new Square(3)));
}
}أنماط السجلات في الحالات
يمكن للحالات فك بنية السجلات، مما يتيح الوصول إلى المكوّنات مباشرةً داخل جسم الفرع.
public class Main {
sealed interface Shape permits Circle, Rectangle {}
record Circle(double r) implements Shape {}
record Rectangle(double w, double h) implements Shape {}
static double area(Shape shape) {
return switch (shape) {
case Circle(double r) -> Math.PI * r * r;
case Rectangle(double w, double h) -> w * h;
};
}
public static void main(String[] args) {
System.out.printf("%.2f%n", area(new Rectangle(2, 5)));
}
}الحواجز باستخدام when
تضيف عبارة when حارسًا منطقيًا إلى الحالة. ولا تنجح الحالة إلا إذا تطابق النمط وكان الحارس صحيحًا.
public class Main {
static String size(Object o) {
return switch (o) {
case Integer i when i < 0 -> "negative";
case Integer i when i == 0 -> "zero";
case Integer i -> "positive";
default -> "not an int";
};
}
public static void main(String[] args) {
System.out.println(size(-5));
System.out.println(size(0));
System.out.println(size(7));
}
}الترتيب مهم مع الحواجز
تُجرَّب الحالات المحروسة من الأعلى إلى الأسفل. ويجب أن تأتي الحالة المحروسة الأكثر تحديدًا قبل الحالة الأوسع غير المحروسة، وإلا ستلتهمها الحالة الأوسع.
معالجة null
أضيفوا case null لمعالجة محدِّد يساوي null؛ وإلا فسيرمي switch استثناء NullPointerException. ويمكنكم حتى دمجهما في case null, default.
public class Main {
static String label(String s) {
return switch (s) {
case null -> "missing";
case "yes" -> "affirmative";
default -> "other: " + s;
};
}
public static void main(String[] args) {
System.out.println(label(null));
System.out.println(label("yes"));
System.out.println(label("maybe"));
}
}الأنماط المتداخلة في switch
يمكن للحالات تداخل أنماط السجلات لمطابقة البنى العميقة ووضع حواجز على القيم الداخلية في موضع واحد.
public class Main {
record Point(int x, int y) {}
record Line(Point a, Point b) {}
static String describe(Object o) {
return switch (o) {
case Line(Point(var x1, var y1), Point(var x2, var y2)) when x1 == x2 -> "vertical";
case Line(Point a, Point b) -> "line";
default -> "other";
};
}
public static void main(String[] args) {
System.out.println(describe(new Line(new Point(1, 0), new Point(1, 5))));
System.out.println(describe(new Line(new Point(0, 0), new Point(2, 3))));
}
}التعليمات والتعبيرات
تعمل مطابقة الأنماط في switch كتعبير، فتُرجع قيمة باستخدام -> أو yield، وتعمل أيضًا كتَعليمة. وتنطبق قواعد الشمول عندما يكون المحدِّد مختومًا.
استبدال تعليمة Visitor البرمجية
تستبدل الأنواع المختومة مع مطابقة الأنماط في switch أنماط Visitor المطولة وسلاسل instanceof بتوزيع موجز يتحقق منه المصرّف على نموذج مغلق.
مفسّر كامل
مقيّم للتعبيرات يستخدم نموذجًا مختومًا ومطابقة الأنماط في switch.
public class Main {
sealed interface Expr permits Num, Add, Mul {}
record Num(int value) implements Expr {}
record Add(Expr left, Expr right) implements Expr {}
record Mul(Expr left, Expr right) implements Expr {}
static int eval(Expr e) {
return switch (e) {
case Num(int v) -> v;
case Add(Expr l, Expr r) -> eval(l) + eval(r);
case Mul(Expr l, Expr r) -> eval(l) * eval(r);
};
}
public static void main(String[] args) {
Expr e = new Add(new Num(2), new Mul(new Num(3), new Num(4)));
System.out.println(eval(e));
}
}اختبار سريع
اختبروا مدى فهمكم للأنماط في switch.
مراجعة
لقد تعلمتم الأنماط في switch.
- يمكن أن تكون الحالات أنماط أنواع وأنماط سجلات، مع فك البنية.
- تمنح المحددات المختومة تعليمات switch شاملة من دون
default. - تُحسّن حواجز
whenالحالات، ويكون الترتيب مهمًا. - تتعامل
case nullمع القيم الفارغة بأمان.
الأسئلة الشائعة
هل درس «الأنماط في switch» مجاني؟
نعم — نص درس «الأنماط في switch» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.
ماذا ستتعلم في «الأنماط في switch»؟
دمج الأنواع المختومة والأنماط تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟
لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «الأنماط في switch»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟
نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- مطابقة الأنماط مع instanceof
- أنماط Record
- أنماط Record المتداخلة
- الأنماط في switch