Menu
flag Ar iconالعربيةdown icon

جملة switch في جافا: الحالات، السقوط التتابعي، وصياغة السهم

شرح جملة switch في جافا: تسميات case، break والسقوط التتابعي، فرع default، تجميع الحالات، صيغة السهم الحديثة، وتعبيرات switch.

تحتوي هذه الصفحة على محررات قابلة للتشغيل - حرّر، شغّل، وشاهد النتيجة فوراً.

ما الغرض من switch

تقارن جملة switch قيمة واحدة بقائمة من الخيارات الثابتة وتُنفّذ الفرع المطابق. عندما تجد نفسك تكتب سلسلة if/else if طويلة تظل تختبر المتغير نفسه مقابل قيم ثابتة مختلفة، فإن جملة switch تقول الشيء نفسه بوضوح أكبر.

إنها تُجري فقط فحوصات المساواة مقابل قيم ثابتة معروفة وقت الترجمة؛ فهي لا تستطيع اختبار المجالات أو دمج الشروط. لتلك الحالات، ابقَ مع if/else.

جملة switch الكلاسيكية

تستخدم الصيغة التقليدية تسميات case مع نقطتين، وbreak بعد كل فرع:

تُقيّم جافا قيمة day، وتقفز إلى الحالة case المطابقة، وتُنفّذ جُملها، ثم تُخرج break من الـ switch. يعمل الفرع default عندما لا يتطابق أي شيء آخر؛ اعتبره بمثابة else. وهو اختياري، لكن تضمينه ممارسة جيدة كي لا تنزلق القيم غير المتوقعة بصمت.

فخّ break: السقوط التتابعي

هذا هو أكثر أخطاء switch شيوعاً على الإطلاق. إذا أغفلت break، فلن يتوقف التنفيذ عند نهاية حالة مطابقة؛ بل يتساقط إلى الحالة التالية ويستمر في العمل حتى يصادف break أو القوس الإغلاقي:

قد تتوقع Level 1 فقط، لكن هذا يطبع الأسطر الثلاثة كلها. لأن case 1 لا يحتوي على break، ينزلق التحكم مباشرة إلى case 2 وcase 3. أضِف break دائماً ما لم تكن تريد السقوط التتابعي فعلاً؛ وعندما تعتمد عليه، اترك تعليقاً ليعرف القارئ التالي أن ذلك كان مقصوداً.

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

للسقوط التتابعي استخدام مشروع ومرتّب واحد: تكديس تسميات case كي تشترك عدة قيم في كتلة واحدة. ضع التسميات متتالية دون شفرة بينها:

هنا تُنفّذ 'A' و'B' و'C' كلها سطر "Pass" نفسه. هذه هي الطريقة المقصودة للقول "أيٌّ من هذه القيم يفعل الشيء نفسه".

switch على السلاسل النصية

لست مقيّداً بالأرقام. منذ جافا 7 يمكنك إجراء switch على String، وهو مثالي لاختيارات القوائم أو أسماء الأوامر:

المطابقة حساسة لحالة الأحرف؛ فلن تتطابق "Stop" مع "stop"، لذا وحّد الحالة أولاً (مثل command.toLowerCase()) إذا كانت حالة أحرف المُدخل قد تتغير. ومزلق آخر: إذا كانت command تساوي null، فإن الـ switch يرمي NullPointerException، لذا احترس من القيمة الفارغة قبل أن تصل إليها.

صياغة السهم الحديثة

تُضيف الإصدارات الأحدث من جافا (14 فما فوق) صيغة سهم، case label -> ...، تُعالج فخّ السقوط التتابعي من حيث التصميم. تُنفّذ كل حالة سهم فرعاً واحداً بالضبط ولا تتساقط أبداً، لذا لا يوجد break لتنساه:

لاحظ أنك تُجمّع القيم بفاصلة (case 6, 7) بدلاً من تكديس التسميات، ولا يوجد ولا break واحد على مرمى البصر. لأكثر من جملة، استخدم كتلة: case 1 -> { ...; ... }. فضّل هذه الصيغة في الشفرة الجديدة؛ فهي أقصر وتُزيل فئة كاملة من الأخطاء.

switch كتعبير

يمكن لصيغة السهم أيضاً أن تُنتج قيمة. يُرجع تعبير switch نتيجة يمكنك إسنادها مباشرة إلى متغير؛ دون متغير مؤقت، ودون إسناد متكرر في كل فرع:

يُقيَّم switch (...) { ... } بأكمله إلى عدد يُخزَّن في days. لاحظ الفاصلة المنقوطة بعد القوس الإغلاقي؛ فهي جزء من جملة الإسناد. يجب أن يكون تعبير switch شاملاً (يغطي كل قيمة ممكنة)، ولهذا يوجد default هنا. إذا احتاج فرع إلى عدة جُمل قبل إرجاع قيمة، فاستخدم كتلة مع yield:

case 2 -> {
    boolean leap = (year % 4 == 0);
    yield leap ? 29 : 28;
}

الكلمة yield هي الطريقة التي تُعيد بها كتلة السهم قيمتها، وهي المكافئ في عالم التعبيرات لـ break الذي يحمل نتيجة.

التالي: حلقات for

تختار switch فرعاً واحداً من بين كثير؛ وأحياناً تحتاج بدلاً من ذلك إلى تكرار كتلة عدة مرات. تُشغّل حلقة for الشفرة عدداً محكوماً من المرات (بالعدّ عبر مجال أو بالتنقل عبر كل عنصر) وهي الصفحة التالية.

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

متى ينبغي أن أستخدم switch بدلاً من if-else في جافا؟

استخدم switch عندما تقارن قيمة واحدة بعدة خيارات ثابتة وثابتة القيمة، مثل رقم يوم، أو اختيار من قائمة، أو enum. تُقرأ بوضوح أكبر من سلسلة if/else if طويلة، وتُشير إلى "اختر فرعاً واحداً من بين هذه القيم المعروفة". ابقَ مع if/else عندما تتضمن شروطك مجالات (x > 10)، أو متغيرات متعددة، أو أي شيء ليس مجرد فحص مساواة بسيط مقابل قيمة ثابتة.

لماذا أحتاج إلى break في جملة switch في جافا؟

في الصياغة الكلاسيكية ذات النقطتين، بمجرد أن تتطابق حالة case، يستمر التنفيذ متساقطاً إلى الحالات التالية حتى يصادف break أو نهاية الـ switch. الكلمة break توقف ذلك. نسيانها خطأ شائع: تتطابق مع case 1: فتشغّل عن طريق الخطأ أيضاً شفرة case 2: وcase 3: وهكذا. أما صياغة السهم الأحدث (case 1 -> ...) فلا تتساقط أبداً، لذا لا تكتب break على الإطلاق.

هل يمكن لجملة switch في جافا أن تعمل مع السلاسل النصية (String)؟

نعم. منذ جافا 7 يمكنك إجراء switch على String، كما يمكنك إجراؤه على int وchar وbyte وshort وأنواع الغلاف الخاصة بها وقيم enum. لا يمكنك إجراء switch على long أو double أو float أو boolean. مطابقة السلاسل النصية حساسة لحالة الأحرف، لذا فإن "Yes" و"yes" حالتان مختلفتان.

Coddy programming languages illustration

تعلّم البرمجة مع Coddy

ابدأ الآن