جمل switch المحسنة في جافا 14
بعدما قامت أوراكل بتغيير جدولة الإصدارات الجديدة من لغة جافا (إصدار جديد كل 6 أشهر)، أصبحنا نرى العديد من التحسينات والمزايا الجديدة. من أهم هذه التحسينات كانت على جمل switch والتي هي من أساسيات لغة جافا وموجودة منذ أول إصدار. تم إضافة هذه التحسينات كميزة تجريبية preview feature في الإصدارين 12 و 13 ثم أصبحت ميزة أساسية ابتداءً من جافا 14 والتي أصدرت يوم 17 مارس 2020.
منذ الإصدار 11 من جافا، تم إضافة ما يسمى بـ (ميزة تجريبية preview feature)، وهي ميزة تكون غير مفعلة بشكل افتراضي ويجب استخدام command-line option لتفعيلها (enable-preview--). عادةً لا ينصح باستخدامها في كود production حيث أن هذه الميزة قد يتم التعديل عليها أو إزالتها بشكل كامل في إصدارات لاحقة.
مراجعة switch statement ما قبل جافا 14
جملة switch تستخدم للتحكم في مسار تنفيذ البرنامج بناءً على قيمة متغير (variable) أو عبارة معينة (expression). الكود الآتي يوضح استخدام بسيط لجملة switch:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public static void foo(int x) { switch(x + 1) { case 1: System.out.println(1); break; case 3: System.out.println(3); System.out.println(3); case 2: System.out.println(2); break; case 4: case 5: { System.out.println(5); break; } case 5: return; default: System.out.println(0); } } |
أولاً يتم تنفيذ العبارة الموجودة ما بين الأقواس () التي تلي الكلمة switch. بعدها يتم المرور على الحالات (case) واحدة تلو الأخرى. عند التطابق مع قيمة أحد الحالات، يتم تنفيذ الأسطر الخاصة بهذه الحالة، ثم يتم تنفيذ الحالات التالية لها بالتسلسل ما لم تتواجد الكلمة break والتي تخرج من جملة switch إلى الجملة التالية (أيضاً return و continue تتسبب في تغيير مسار تنفيذ البرنامج). في حال لم يتم التطابق مع جميع الحالات، يتم تنفيذ الحالة default. وإذا لم تتطابق جميع الحالات ولا توجد حالة default، سيتم الخروج من جملة switch.
هنا بعض النقاط التي توضح تفاصيل أخرى لجمل switch:
- العبارة الموجودة ما بين الأقواس () التي تلي الكلمة switch يجب أن تكون ضمن أحد الأنواع التالية: [byte و Byte و short و Short و int و Integer و char و Character] وأيضاً enums. منذ جافا 7، تم إضافة String.
- إذا كان نوع المتغير المستخدم enum، فيجب استخدام القيم بدون اسم الـ enum. فمثلاً DayOfWeek هو enum، ويجب أن تكون الحالات بهذا الشكل: case SUNDAY وليس case DayOfWeek.SUNDAY.
- تمرير null لجملة switch سيتسبب بـ NullPointerException.
- لا يشترط وجود أقواس {} للأسطر الخاصة بالحالات (كما هو الحال في case 3).
- الحالة default هي اختيارية. أيضاً ليس شرطاً أن تكون آخر حالة، ويمكن وضعها كأول حالة مثلاً.
- الكلمة break يمكن استخدامها في الحالة الأخيرة، ولكن لا فائدة من ذلك.
التحسينات على switch statement في جافا 14
- أصبح بالإمكان إضافة أكثر من قيمة في نفس الحالة:
1 2 3 4 5 6 7 8 9 10 11 |
public static void foo(int x) { switch(x) { case 1, 3, 5, 7, 9: System.out.println("odd"); break; case 0, 2, 4, 6, 8: System.out.println("even"); } } |
- يمكن استبدال النقاط : بالأسهم <-، وهنا يجب أن تكون أسطر الحالات سطر واحد فقط كحد أقصى (يمكن أن يكون block محاط بالأقواس {}). أيضاً لن يتم تنفيذ الحالات بالتسلسل عند استخدام الأسهم، حيث سيتم تنفيذ السطر الخاص بالحالة المطابقة فقط (no fall-through):
1 2 3 4 5 6 7 8 |
public static void foo(int x) { switch(x) { case 1, 3, 5, 7, 9 -> System.out.println("odd"); case 0, 2, 4, 6, 8 -> System.out.println("even"); } } |
لا يمكن استخدام النقاط : والأسهم <- معاً في جملة switch واحدة.
إضافة switch expression في جافا 14
بالإضافة لجملة switch، تم إضافة ميزة جديدة تسمى بـ switch expression (عبارة switch). والعبارة (expression) تعني بأنه يمكن تحويلها إلى قيمة تُسند إلى متغير. هنا مثال:
1 2 3 4 5 6 7 |
var dayOfWeek = LocalDate.now().getDayOfWeek(); boolean weekend = switch(dayOfWeek) { case FRIDAY, SATURDAY -> true; case SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY -> false; }; |
أيضاً تم إضافة keyword جديد في جافا 14 (yield) يستخدم لإرجاع قيمة من داخل أحد الحالات (عملها يشبه عمل return من داخل الدوال). يستخدم إذا كان السطر الخاص بالحالة عبارة عن block محاط بأقواس {} أو تم استخدام النقاط : بالأسهم <-:
1 2 3 4 5 6 7 8 9 10 11 |
var dayOfWeek = LocalDate.now().getDayOfWeek(); boolean vacation = switch(dayOfWeek) { case FRIDAY, SATURDAY -> { if(workNotFinishedYet) yield false; else yield true; } case SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY -> false; }; |
1 2 3 4 5 6 7 |
var dayOfWeek = LocalDate.now().getDayOfWeek(); boolean weekend = switch(dayOfWeek) { case FRIDAY, SATURDAY: yield true; case SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY: yield false; }; |
يمكن أيضاً إضافة throw exception داخل عبارة switch:
1 2 3 4 5 6 7 8 9 |
public static boolean isEven(int x) { return switch(x) { case 1, 3, 5, 7, 9 -> false; case 0, 2, 4, 6, 8 -> true; default -> throw new IllegalArgumentException("value must be in between 0 and 9"); }; } |
لاحظ بأن الـ switch expression لابد أن تنتهي بفاصلة منقوطة ; بعكس الـ switch statement.
بعكس الـ switch statement أيضاً، يجب تغطية جميع الحالات (cases) عند استخدام الـ switch expression.
أداة البحث
التصنيفات
- أمن معلومات (1)
- برمجة (7)
أضف تعليقك