تخطَّ إلى المحتوى

الشروط في Java: if و switch

الدرس 3 من 11 · Java

البرامج تتخذ قرارات في كل لحظة: هل كلمة المرور صحيحة؟ هل الرصيد كافٍ؟ هل الطالب ناجح؟ في هذا الدرس ستتعلم أدوات القرار في Java، ومعها فخ مشهور جداً يقع فيه أغلب المبتدئين عند مقارنة النصوص، وستتعلم كيف تتجنبه من البداية.

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("تفضل بالدخول");
}
الناتج
تفضل بالدخول

لاختيار قيمة من اثنتين في سطر واحد:

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));
الناتج
false
true
true

النصان متطابقان حرفاً حرفاً، فلماذا أعطت == النتيجة false؟!

لأن String كلاس، والمتغير لا يحمل النص نفسه بل عنوانه في الذاكرة. و == تقارن العناوين: هل هذان المتغيران يشيران إلى نفس المكان؟ أما equals فتقارن المحتوى حرفاً حرفاً.

تخيّل نسختين من نفس الكتاب في مكتبتين مختلفتين: المحتوى متطابق تماماً (equals تقول نعم)، لكنهما ليسا نفس النسخة (== تقول لا).

عندما تقارن قيمة واحدة بعدة احتمالات، استخدم 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("فصل آخر");
}
الناتج
الشتاء

اكتب برنامج تسجيل دخول بسيطاً:

  1. متغيران: username و password بقيم ثابتة.
  2. إذا كان الاسم "admin" وكلمة المرور "1234" (استخدم equals!) اطبع «أهلاً بك»، وإلا اطبع «بيانات خاطئة».
  3. أضف متغيراً role واستخدم switch ليطبع صلاحيات مختلفة لـ "admin" و "teacher" و "student".

تحدٍّ: استخدم المعامل الثلاثي لطباعة «زوجي» أو «فردي» لأي رقم.

  • مقارنة النصوص بـ ==: استخدم equals دائماً.
  • كتابة = بدل == في الشرط: if (x = 5) يرفضها المترجم مع الأعداد، لأن النتيجة ليست boolean.
  • ترتيب الشروط: إذا بدأت بـ score >= 50 فلن يصل أحد إلى «ممتاز».

سؤال

ما الطريقة الصحيحة لفحص هل النص name يساوي «سارة»؟

سؤال

ما ميزة صيغة switch بالأسهم -> مقارنة بالصيغة القديمة؟

  • if و else if و else للقرارات، والشرط من نوع boolean.
  • && و || و ! لدمج الشروط، والمعامل الثلاثي ? : لاختيار قيمة في سطر واحد.
  • قارن النصوص بـ equals دائماً، و == للأنواع البدائية فقط.
  • switch الحديث بالأسهم يقبل عدة قيم في الحالة، ويُرجع قيمة، ولا يحتاج break.
  • default تلتقط كل الحالات غير المذكورة.