الشروط في Java: if و switch
البرامج تتخذ قرارات في كل لحظة: هل كلمة المرور صحيحة؟ هل الرصيد كافٍ؟ هل الطالب ناجح؟ في هذا الدرس ستتعلم أدوات القرار في Java، ومعها فخ مشهور جداً يقع فيه أغلب المبتدئين عند مقارنة النصوص، وستتعلم كيف تتجنبه من البداية.
if و else
Section titled “if و else”int score = 72;
if (score >= 90) { System.out.println("ممتاز");} else if (score >= 50) { System.out.println("ناجح");} else { System.out.println("راسب");}ناجح- الشرط بين قوسين، ويجب أن تكون نتيجته
boolean. - Java تفحص من الأعلى، وتنفّذ أول فرع صحيح فقط.
- القوسان المعقوفان يحددان الكود التابع لكل فرع.
عوامل المقارنة: == و != و > و < و >= و <=.
العوامل المنطقية: && (و)، و || (أو)، و ! (ليس):
int age = 16;boolean hasTicket = true;if (age >= 13 && hasTicket) { System.out.println("تفضل بالدخول");}تفضل بالدخولالمعامل الثلاثي
Section titled “المعامل الثلاثي”لاختيار قيمة من اثنتين في سطر واحد:
int stock = 0;String status = stock > 0 ? "متوفر" : "غير متوفر";System.out.println(status);غير متوفراقرأه: «هل الشرط صحيح؟ إذن القيمة الأولى، وإلا فالثانية». ومثال آخر:
int total = 650;int shipping = total >= 500 ? 0 : 40;System.out.println("الشحن: " + shipping + " جنيه");الشحن: 0 جنيهالفخ الشهير: مقارنة النصوص
Section titled “الفخ الشهير: مقارنة النصوص”انظر إلى هذا الكود:
String input = new String("java");String word = "java";System.out.println(input == word);System.out.println(input.equals(word));System.out.println("JAVA".equalsIgnoreCase(word));falsetruetrueالنصان متطابقان حرفاً حرفاً، فلماذا أعطت == النتيجة false؟!
لأن String كلاس، والمتغير لا يحمل النص نفسه بل عنوانه في الذاكرة. و == تقارن العناوين: هل هذان المتغيران يشيران إلى نفس المكان؟ أما equals فتقارن المحتوى حرفاً حرفاً.
تخيّل نسختين من نفس الكتاب في مكتبتين مختلفتين: المحتوى متطابق تماماً (equals تقول نعم)، لكنهما ليسا نفس النسخة (== تقول لا).
تعبير switch الحديث
Section titled “تعبير switch الحديث”عندما تقارن قيمة واحدة بعدة احتمالات، استخدم switch. وفي Java الحديثة (منذ Java 14) صيغة بالأسهم أنظف بكثير:
String day = "الجمعة";
String message = switch (day) { case "الجمعة", "السبت" -> "عطلة نهاية الأسبوع"; case "الأحد" -> "أول أيام الدراسة"; default -> "يوم دراسي عادي";};
System.out.println(message);عطلة نهاية الأسبوعcaseيتبعه قيمة أو عدة قيم بينها فاصلة، ثم السهم->ثم النتيجة.defaultلكل ما لم يطابق الحالات السابقة.switchهنا تعبير يُرجع قيمة نضعها في متغير مباشرة، ولاحظ الفاصلة المنقوطة بعد القوس الأخير.switchتقارن النصوص بالمحتوى تلقائياً، فلا تقلق من فخ==هنا.
ويمكن استخدامه أيضاً لتنفيذ أوامر دون إرجاع قيمة:
int month = 2;switch (month) { case 12, 1, 2 -> System.out.println("الشتاء"); case 3, 4, 5 -> System.out.println("الربيع"); default -> System.out.println("فصل آخر");}الشتاءجرّب بنفسك
Section titled “جرّب بنفسك”اكتب برنامج تسجيل دخول بسيطاً:
- متغيران:
usernameوpasswordبقيم ثابتة. - إذا كان الاسم
"admin"وكلمة المرور"1234"(استخدمequals!) اطبع «أهلاً بك»، وإلا اطبع «بيانات خاطئة». - أضف متغيراً
roleواستخدمswitchليطبع صلاحيات مختلفة لـ"admin"و"teacher"و"student".
تحدٍّ: استخدم المعامل الثلاثي لطباعة «زوجي» أو «فردي» لأي رقم.
أخطاء شائعة
Section titled “أخطاء شائعة”- مقارنة النصوص بـ ==: استخدم
equalsدائماً. - كتابة = بدل == في الشرط:
if (x = 5)يرفضها المترجم مع الأعداد، لأن النتيجة ليستboolean. - ترتيب الشروط: إذا بدأت بـ
score >= 50فلن يصل أحد إلى «ممتاز».
اختبر نفسك
Section titled “اختبر نفسك”سؤال
ما الطريقة الصحيحة لفحص هل النص name يساوي «سارة»؟
equals تقارن محتوى النصين، أما == فتقارن عنوانيهما في الذاكرة وقد تعطي نتيجة خاطئة.
سؤال
ما ميزة صيغة switch بالأسهم -> مقارنة بالصيغة القديمة؟
الصيغة الحديثة لا تنزلق للحالة التالية، فلا تحتاج break، ويمكن استخدامها كتعبير يُرجع قيمة.
الخلاصة
Section titled “الخلاصة”ifوelse ifوelseللقرارات، والشرط من نوعboolean.&&و||و!لدمج الشروط، والمعامل الثلاثي? :لاختيار قيمة في سطر واحد.- قارن النصوص بـ
equalsدائماً، و==للأنواع البدائية فقط. switchالحديث بالأسهم يقبل عدة قيم في الحالة، ويُرجع قيمة، ولا يحتاجbreak.defaultتلتقط كل الحالات غير المذكورة.