جاوا سوئچ کے بارے میں تھوڑا سا نظریہ

تصور کریں کہ آپ ایک نائٹ ہیں جو سڑک کے کانٹے پر رک گئے ہیں۔ اگر آپ بائیں جائیں گے تو آپ اپنا گھوڑا کھو دیں گے۔ اگر تم صحیح چلو گے تو علم حاصل کرو گے۔ ہم کوڈ میں اس صورتحال کی نمائندگی کیسے کریں گے؟ آپ شاید پہلے ہی جان چکے ہوں گے کہ ہم یہ فیصلے کرنے کے لیے if-then اور if-then-else جیسی تعمیرات کا استعمال کرتے ہیں۔
if (turn_left) {
    System.out.println("You will lose your horse");
}
if (turn_right) {
    System.out.println("You will gain knowledge");
}
else
    System.out.println("So you're just going to stand there?");
لیکن اگر سڑک دو نہیں بلکہ دس میں تقسیم ہو جائے تو کیا ہوگا؟ آپ کے پاس ایسی سڑکیں ہیں جو "مکمل طور پر دائیں"، "اس کے بائیں طرف"، "بائیں طرف تھوڑا سا اور" اور اسی طرح، کل 10 ممکنہ سڑکیں ہیں؟ تصور کریں کہ اس ورژن میں آپ کا "اگر-تو-اور " کوڈ کیسے بڑھے گا!
if (option1)
{}
else if (option2)
{}else if (optionN) ...
فرض کریں کہ آپ کے پاس سڑک پر 10 طرفہ کانٹا ہے (یہاں یہ ضروری ہے کہ اختیارات کی تعداد محدود ہو)۔ اس طرح کے حالات کے لیے جاوا کے پاس سوئچ اسٹیٹمنٹ ہے۔
switch (ExpressionForMakingAChoice) {
           case (Value1):
               Code1;
               break;
           case (Value2):
               Code2;
               break;
...
           case (ValueN):
               CodeN;
               break;
           default:
               CodeForDefaultChoice;
               break;
       }
اس طرح بیان کام کرتا ہے:
  • ExpressionForMakingAChoice کا جائزہ لیا جاتا ہے۔ پھر سوئچ اسٹیٹمنٹ نتیجے میں آنے والی قدر کا موازنہ اگلے ValueX سے کرتا ہے (جس ترتیب میں وہ درج ہیں)۔
  • اگر ExpressionForMakingAChoice ValueX سے مماثلت رکھتا ہے، تو بڑی آنت کے بعد کوڈ کو عمل میں لایا جاتا ہے۔
  • اگر بریک اسٹیٹمنٹ کا سامنا ہوتا ہے، تو کنٹرول سوئچ اسٹیٹمنٹ سے باہر منتقل ہوجاتا ہے۔
  • اگر ExpressionForMakingAChoice کسی ValueX سے مماثل نہیں ہے، تو کنٹرول CodeForDefaultCase کو جاتا ہے۔
اہم نکات
  • سوئچ اسٹیٹمنٹ میں، ExpressionForMakingAChoice کی قسم درج ذیل میں سے ایک ہونی چاہیے:

    • بائٹ , مختصر , چار , int .
    • بائٹ ، شارٹ ، کریکٹر ، انٹیجر (آدمی ڈیٹا ٹائپس کے ریپرز)۔
    • تار _
    • اینوم _
  • پہلے سے طے شدہ بلاک اختیاری ہے۔ اگر یہ غیر حاضر ہے اور ExpressionForMakingAChoice کسی ValueX سے مماثل نہیں ہے، تو کوئی کارروائی عمل میں نہیں لائی جائے گی۔
  • وقفے کے بیان کی ضرورت نہیں ہے۔ اگر یہ غیر حاضر ہے، تو کوڈ کا عمل جاری رہے گا (کیس کے بیانات میں مزید موازنہ کو نظر انداز کرتے ہوئے) وقفے کی پہلی موجودگی تک یا سوئچ اسٹیٹمنٹ کے اختتام تک ۔
  • اگر ایک ہی کوڈ کو کئی انتخاب کے لیے عمل میں لانے کی ضرورت ہے، تو ہم مسلسل کئی کیس بیانات کی وضاحت کر کے نقل کو ختم کر سکتے ہیں۔

آئیے اب اس پر ایک نظر ڈالتے ہیں کہ جاوا میں سوئچ اسٹیٹمنٹ کیسے استعمال ہوتا ہے۔

آپ پریشان نہ ہوں: ہم نظریہ کے ساتھ کام کر چکے ہیں۔ مندرجہ ذیل مثالوں کو دیکھنے کے بعد سب کچھ واضح ہو جائے گا۔ ٹھیک ہے، چلو شروع کرتے ہیں۔ آئیے ہمارے نظام شمسی کے سیاروں پر مشتمل فلکیات کی ایک مثال دیکھیں۔ تازہ ترین بین الاقوامی رویوں کے مطابق، ہم نے پلوٹو کو (اس کے مدار کی خصوصیات کی وجہ سے) خارج کر دیا ہے۔ ہمیں یاد ہے کہ ہمارے سیارے سورج سے ان کے فاصلے کے مطابق ترتیب دیئے گئے ہیں: عطارد، زہرہ، زمین، مریخ، مشتری، زحل، یورینس اور نیپچون۔ آئیے ایک جاوا طریقہ لکھتے ہیں جو کسی سیارے کا آرڈینل نمبر لیتا ہے (سورج سے اس کے فاصلے کے نسبت) اور سیارے کے ماحول کے اہم اجزاء کو بطور List <String> لوٹاتا ہے ۔ آپ کو یاد ہوگا کہ کچھ سیاروں کی فضا کی ساخت ایک جیسی ہے۔ اس طرح، وینس اور مریخ بنیادی طور پر کاربن ڈائی آکسائیڈ پر مشتمل ہے۔ مشتری اور زحل کا ماحول ہائیڈروجن اور ہیلیم پر مشتمل ہے۔ اور یورینس اور نیپچون گیسوں کے آخری جوڑے میں میتھین کا اضافہ کرتے ہیں۔ یہاں ہمارا فنکشن ہے:
public static List<String> getPlanetAtmosphere(int seqNumberFromSun) {
    List<String> result = new ArrayList<>();
    switch (seqNumberFromSun) {
        case 1: result.add("No atmosphere");
            break;
        case 2:
        case 4: result.add("Carbon dioxide");
            break;
        case 3: result.add("Carbon dioxide");
            result.add("Nitrogen");
            result.add ("Oxygen");
            break;
        case 5:
        case 6: result.add("Hydrogen");
            result.add("Helium");
            break;
        case 7:
        case 8: result.add("Methane");
            result.add("Hydrogen");
            result.add("Helium");
            break;
        default:
            break;
    }
    return result;
}
نوٹ کریں کہ ہم سیاروں کے لیے ایک ہی کوڈ کا استعمال کر رہے ہیں جن کی فضا میں ایک جیسی ساخت ہے۔ ہم نے لگاتار کیس کے بیانات کا استعمال کرکے ایسا کیا ۔ اگر ہم اپنے آبائی سیارے کے ماحول کی ترکیب حاصل کرنا چاہتے ہیں، تو ہم اپنے طریقہ کو 3 کے ساتھ دلیل کے طور پر کہتے ہیں:
getPlanetAtmosphere(3).
System.out.println(getPlanetAtmosphere(3)) returns ["Carbon dioxide", "Nitrogen", "Oxygen"].
وقفے کے ساتھ تجربہ: اگر ہم تمام وقفے کے بیانات کو ہٹا دیں تو کیا ہوگا؟ آئیے اسے آزمائیں:
public static List<String> getPlanetAtmosphere(int seqNumberFromSun) {
    List<String> result = new ArrayList<>();
    switch (seqNumberFromSun) {
        case 1: result.add("No atmosphere");
        case 2:
        case 4: result.add("Carbon dioxide");
        case 3: result.add("Carbon dioxide");
            result.add("Nitrogen");
            result.add ("Oxygen");
        case 5:
        case 6: result.add("Hydrogen");
            result.add("Helium");
        case 7:
        case 8: result.add("Methane");
            result.add("Hydrogen");
            result.add("Helium");
        default:
    }
    return result;
}
اگر ہم System.out.println(getPlanetAtmosphere(3)) کا نتیجہ پرنٹ کرتے ہیں ، تو ہمیں معلوم ہوتا ہے کہ ہمارا گھریلو سیارہ اتنا رہنے کے قابل نہیں ہے۔ یا یہ ہے؟ خود فیصلہ کریں: ["کاربن ڈائی آکسائیڈ"، "نائٹروجن"، "آکسیجن"، "ہائیڈروجن"، "ہیلیم"، "میتھین"، "ہائیڈروجن"، "ہیلیم"] ۔ ایسا کیوں ہوا؟ پروگرام پہلے میچ کے بعد سوئچ بلاک کے اختتام تک کیس کے تمام بیانات پر عمل درآمد کرتا ہے۔

وقفے کے بیانات کی ضرورت سے زیادہ اصلاح

نوٹ کریں کہ ہم وقفے کے بیانات اور مقدمات کو مختلف طریقے سے ترتیب دے کر طریقہ کو بہتر بنا سکتے ہیں ۔
public static List<String> getPlanetAtmosphere(int seqNumberFromSun) {
    List<String> result = new ArrayList<>();
    switch (seqNumberFromSun) {
        case 1: result.add("No atmosphere");
                break;
        case 3: result.add("Nitrogen");
                result.add ("Oxygen");
        case 2:
        case 4: result.add("Carbon dioxide");
                break;
        case 7:
        case 8: result.add("Methane");
        case 5:
        case 6: result.add("Hydrogen");
                result.add("Helium");
    }
     return result;
}
کم کوڈ کی طرح لگتا ہے، ٹھیک ہے؟ ہم نے کیس کے بیانات کی ترتیب کے ساتھ کھیل کر اور ان کو دوبارہ منظم کر کے بیانات کی کل تعداد کو کم کر دیا ہے۔ اب ہر قسم کی گیس کو کوڈ کی صرف ایک لائن میں فہرست میں شامل کیا گیا ہے۔ آخری مثال میں دیا گیا کوڈ صرف یہ دکھانے کے لیے ہے کہ چیزیں کیسے کام کرتی ہیں۔ ہم اس طرح کوڈ لکھنے کی سفارش نہیں کرتے ہیں۔ اگر اس طرح کے جاوا کوڈ کے مصنف (دوسرے پروگرامرز کو چھوڑ دیں) اسے برقرار رکھنا ضروری ہے، تو اسے ان کیس بلاکس کی تشکیل کے پیچھے منطق اور سوئچ سٹیٹمنٹ میں نافذ کردہ کوڈ کی تشکیل نو کرنا بہت مشکل ہوگا ۔

اگر سے فرق

if اور switch سٹیٹمنٹس کی ظاہری مماثلت کو دیکھتے ہوئے ، یہ نہ بھولیں کہ سوئچ سٹیٹمنٹ ایک مخصوص VALUE کی بنیاد پر کیسز میں سے ایک کو منتخب کرتا ہے، جبکہ if سٹیٹمنٹ میں کوئی بولین اظہار ہو سکتا ہے۔ اپنے کوڈ کو ڈیزائن کرتے وقت اسے ذہن میں رکھیں۔

نتیجہ

  • کیس اسٹیٹمنٹ کو دو سے زیادہ برانچوں کے لیے استعمال کریں تاکہ آپ کے کوڈ کو if اسٹیٹمنٹس کے ساتھ بے ترتیبی نہ ہو۔
  • بریک اسٹیٹمنٹ ڈال کر ہر مخصوص ویلیو (کیس اسٹیٹمنٹ) کے لیے برانچ کے منطقی بلاک کو مکمل کرنا نہ بھولیں ۔
  • سوئچ سٹیٹمنٹ کا اظہار Enum یا String ہو سکتا ہے ، نیز کچھ قدیم اقسام۔
  • پہلے سے طے شدہ بلاک کو یاد رکھیں ۔ غیر متوقع اقدار کو سنبھالنے کے لیے اسے استعمال کریں۔
  • کارکردگی کو بہتر بنانے کے لیے، سب سے عام اقدار کے مطابق کوڈ کی شاخوں کو سوئچ بلاک کے آغاز میں منتقل کریں ۔
  • کیس سٹیٹمنٹس کے آخر میں بریک سٹیٹمنٹس کو ڈیلیٹ کر کے اپنی "آپٹیمائزیشن" میں مت بہہ جائیں - ایسے کوڈ کو سمجھنا مشکل ہے، اور نتیجے کے طور پر، برقرار رکھنا مشکل ہے۔