JavaRush /جاوا بلاگ /Random-UR /جاوا میں بیان سوئچ کریں۔

جاوا میں بیان سوئچ کریں۔

گروپ میں شائع ہوا۔
تصور کریں کہ آپ ایک کانٹے پر کھڑے ہیں، جیسے کسی مشہور پینٹنگ کے ہیرو۔ اگر آپ بائیں طرف جائیں گے تو آپ اپنے گھوڑے کو کھو دیں گے، اگر آپ دائیں طرف جائیں گے تو آپ کو علم حاصل ہوگا۔ ایسی صورتحال میں پروگرام کیسے کریں؟ آپ غالباً پہلے ہی جان چکے ہوں گے کہ ہم ایسا انتخاب if-then اور if-then-else کنسٹرکٹس کا استعمال کرتے ہوئے کرتے ہیں ۔
if (turn_left) {
    System.out.println(«Коня потеряешь»);
}
if (turn_right) {
    System.out.println(“Знания обретёшь”);
}
else
    System.out.println(“Так и будешь стоять?);
کیا ہوگا اگر اس طرح کے دو نہیں بلکہ 10 ٹریک ہوں؟ کیا 10 ٹکڑوں کی مقدار میں "دائیں طرف"، "تھوڑا سا بائیں"، "بائیں طرف تھوڑا زیادہ" اور اسی طرح کوئی راستہ ہے؟ تصور کریں کہ اس ورژن میں آپ کا if-then-else کوڈ کیسے بڑھے گا!
if (вариант1)
{}
else if (вариант2)
{}else if (вариантN).
لہذا، آپ کے پاس شرائط کا ایک کانٹا نہیں ہے، لیکن کئی، کہتے ہیں، 10 (یہاں اہم بات یہ ہے کہ کانٹے کی تعداد محدود ہے)۔ اس طرح کے حالات کے لیے، ایک خصوصی سلیکشن آپریٹر ہے - switch case java ۔
switch (ВыражениеДляВыбора) {
           case  (Значение1):
               Код1;
               break;
           case (Значение2):
               Код2;
               break;
...
           case (ЗначениеN):
               КодN;
               break;
           default:
               КодВыбораПоУмолчанию;
               break;
       }
بیان میں پھانسی کا حکم درج ذیل ہے:
  • SelectionExpression کا جائزہ لیا جاتا ہے۔ اس کے بعد، سوئچ اسٹیٹمنٹ نتیجے کے اظہار کا موازنہ اگلی قدر سے کرتا ہے ( درج ترتیب میں)۔
  • اگر SelectExpression ویلیو سے میل کھاتا ہے، تو بڑی آنت کے بعد کا کوڈ عمل میں آتا ہے۔
  • اگر بریک کنسٹرکٹ کا سامنا ہوتا ہے ، تو کنٹرول سوئچ کمانڈ سے باہر منتقل ہوتا ہے۔
  • اگر ExpressionForSelection اور Values ​​کے درمیان کوئی مماثلت نہیں ملتی ہے، تو کنٹرول DefaultSelectionCode میں منتقل ہو جاتا ہے۔
اہم نکات
  • جاوا میں سوئچ سلیکشن اسٹیٹمنٹ کے لیے SelectionExpression کی قسم درج ذیل میں سے ایک ہونی چاہیے۔

    • بائٹ , مختصر , چار , int .
    • ان کے ریپر بائٹ ، شارٹ ، کریکٹر ، انٹیجر ہیں ۔
    • سٹرنگ (جاوا 7 کے بعد سے)۔
    • شمار ( Enum )
  • پہلے سے طے شدہ بلاک اختیاری ہے، پھر اگر SelectionExpression اور اقدار مماثل نہیں ہیں، کوئی کارروائی نہیں کی جائے گی۔
  • وقفہ اختیاری ہے؛ اگر یہ موجود نہیں ہے تو، کوڈ پر عمل درآمد جاری رہے گا (بلاکس کی صورت میں قدروں کے مزید موازنہ کو نظر انداز کرتے ہوئے) جب تک کہ پہلے breakسوئچ اسٹیٹمنٹ کا سامنا نہ ہو یا آخر تک۔
  • اگر متعدد انتخابی اختیارات کے لیے ایک ہی کوڈ کو عمل میں لانا ضروری ہو تو، نقل سے بچنے کے لیے ہم مسلسل کیس بلاکس میں اس کے سامنے متعدد متعلقہ اقدار کی نشاندہی کرتے ہیں ۔

آئیے جاوا میں سوئچ اسٹیٹمنٹ کو استعمال کرنے کی مشق کی طرف چلتے ہیں۔

پریشان نہ ہوں، ہم تھیوری کے ساتھ کام کر چکے ہیں، اور مزید مثالوں کے بعد سب کچھ واضح ہو جائے گا۔ تو آئیے شروع کرتے ہیں۔ آئیے نظام شمسی کے سیاروں کے بارے میں فلکیات سے ایک مثال دیکھتے ہیں۔ تازہ ترین بین الاقوامی ضوابط کے مطابق، ہم پلوٹو (اس کے مدار کی خصوصیات کی وجہ سے) کو خارج کر دیں گے۔ آئیے یاد رکھیں کہ ہمارے سیارے سورج سے درج ذیل ترتیب میں واقع ہیں: عطارد، زہرہ، زمین، مریخ، مشتری، زحل، یورینس اور نیپچون۔ آئیے ایک جاوا طریقہ بنائیں جو ان پٹ کے طور پر سیارے کا سیریل نمبر حاصل کرتا ہے (سورج سے فاصلے کے نسبت)، اور آؤٹ پٹ کے طور پر اس سیارے کے ماحول کی بنیادی ساخت کو 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)) вернет нам [Углекислый газ, Азот, Кислород].
وقفے کے ساتھ تجربہ کریں اگر ہم تمام وقفے کے بیانات کو ہٹا دیں تو کیا ہوگا ؟ آئیے اسے عملی طور پر آزمائیں:
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 کے بیانات ظہور میں ایک جیسے ہیں ، یہ نہ بھولیں کہ ایک سے زیادہ پسند آپریٹر سوئچ ایک مخصوص قدر پر عمل درآمد کے اختیارات کے انتخاب کی بنیاد رکھتا ہے، جبکہ if میں۔ کوئی بھی منطقی اظہار ہو سکتا ہے۔ اپنے کوڈ کو ڈیزائن کرتے وقت اس حقیقت کو مدنظر رکھیں۔ آئیے جاوا کے مختلف ورژن میں سوئچ کے لیے اختراعات پر گہری نظر ڈالتے ہیں۔

جاوا 7 میں سوئچ کریں۔

جاوا 7 سے پہلے، بائٹ، شارٹ، چار اور انٹ پرائمیٹوز کو سوئچ کی قدر کے طور پر استعمال کیا جا سکتا تھا۔ اوپر دی گئی قدیم اقسام کے اینوم اور ریپرز کے لیے بھی سپورٹ موجود تھی: کریکٹر، بائٹ، شارٹ، اور انٹیجر۔ لیکن اکثر ہمیں جاوا سوئچ سٹرنگ کی قدر تلاش کرنے کی ضرورت ہوتی ہے! یہ جاوا 6 میں ایسا ہی نظر آئے گا:
DayOfWeek day = DayOfWeek.fromValue("Thursday");

switch (day) {
  case MONDAY:
     System.out.println("Today is windy !");
     break;
  case THURSDAY:
     System.out.println("Today is sunny !");
     break;
  case WEDNESDAY:
     System.out.println("Today is rainy!");
     break;
  default:
     System.out.println("Oooops, something wrong !");
اور enum:
public enum DayOfWeek {
  MONDAY("Monday"),
  THURSDAY("Thursday"),
  WEDNESDAY("Wednesday"),
  NOT_FOUND("Not found");

  private final String value;

  DayOfWeek(final String value) {
     this.value = value;
  }

  public static DayOfWeek fromValue(String value) {
     for (final DayOfWeek dayOfWeek : values()) {
        if (dayOfWeek.value.equalsIgnoreCase(value)) {
           return dayOfWeek;
        }
     }
     return NOT_FOUND;
  }
}
لیکن جاوا 7 کے ساتھ شروع کرتے ہوئے، سٹرنگ کی قسم کو سوئچ کی قدر کے طور پر استعمال کرنا ممکن تھا:
String day = "Thursday";

switch (day) {
  case "Monday":
     System.out.println("Today is windy !");
     break;
  case "Thursday":
     System.out.println("Today is sunny !");
     break;
  case "Wednesday":
     System.out.println("Today is rainy!");
     break;
  default:
     System.out.println("Oooops, something wrong !");
}
نئی خصوصیات کے باوجود، enum استعمال کرنے کا طریقہ زیادہ لچکدار ہے اور استعمال کے لیے تجویز کیا جاتا ہے: ہم اس enum کو کئی بار دوبارہ استعمال کر سکتے ہیں۔

جاوا 12 میں سوئچ کریں۔

جاوا 12 نے پیٹرن میچنگ کے لیے سوئچ ایکسپریشنز کو بہتر بنایا ہے۔ اگر ہم اوپر کی مثال کے طور پر سوئچ کا استعمال کرتے ہیں تو، کچھ متغیر کی قدر مقرر کرنے کے لیے، ہمیں قدر کا حساب لگانا ہوگا اور اسے دیئے گئے متغیر کو تفویض کرنا ہوگا، اور پھر وقفے کا استعمال کریں:
int count = 2;
int value;
switch (count) {
  case 1:
     value = 12;
     break;
  case 2:
     value = 32;
     break;
  case 3:
     value = 52;
     break;
  default:
     value = 0;
}
لیکن جاوا 12 کی صلاحیتوں کی بدولت، ہم اس اظہار کو اس طرح دوبارہ لکھ سکتے ہیں:
int value = switch (count) {
  case 1:
     break 12;
  case 2:
     break 32;
  case 3:
     break 52;
  default:
     break 0;
};
آئیے تبدیلیوں کو تھوڑا سا دیکھتے ہیں:
  1. اگر پہلے ہم کیس بلاکس کے اندر ایک متغیر ویلیو سیٹ کرتے ہیں، چونکہ سوئچ اسٹیٹمنٹ بذات خود کچھ بھی واپس نہیں کر سکتا تھا، اب ہمارے پاس ایسا موقع ہے، اور ہم براہ راست سوئچ کا استعمال کرکے ویلیو واپس کرتے ہیں۔

  2. پہلے، ہمارے پاس وقفے کے دائیں طرف کچھ نہیں رہ سکتا تھا، لیکن اب ہم اسے واپسی کے بیان کے طور پر اپنے سوئچ کی قدر واپس کرنے کے لیے استعمال کرتے ہیں۔ بڑی آنت کے نشان اسٹیٹمنٹ بلاک میں انٹری پوائنٹ کو نشان زد کرتے ہیں۔ یعنی، اس وقت سے نیچے دیے گئے تمام کوڈ پر عمل درآمد شروع ہو جاتا ہے، یہاں تک کہ جب کسی اور لیبل کا سامنا ہو۔

    نتیجہ نشان سے نشان تک ایک اختتام سے آخر تک منتقلی ہے، جسے فال تھرو بھی کہا جاتا ہے۔

جاوا میں بیان سوئچ کریں - 2اس طرح کے پاس کو مکمل کرنے کے لیے، آپ کو یا تو تمام عناصر کو مکمل طور پر جانا چاہیے، یا وقفے یا واپسی کا استعمال کرنا چاہیے۔ جاوا 12 میں اختراع ہمیں لیمبڈا آپریٹر کو استعمال کرنے کی صلاحیت فراہم کرتی ہے، جو اس بات کو یقینی بناتا ہے کہ صرف اس کے دائیں طرف کا کوڈ ہی عمل میں آئے گا۔ بغیر کسی "ناکامی" کے۔ اس معاملے میں پچھلی مثال کیسی نظر آئے گی:
int count = 2;
int value = switch (count) {
  case 1 -> 12;
  case 2 -> 32;
  case 3 -> 52;
  default -> 0;
};
کوڈ بہت آسان ہو گیا ہے، ہے نا؟ اور ایک چیز: لیمبڈا آپریٹر بڑی آنت کے ایک عام اینالاگ کے طور پر بھی کام کر سکتا ہے، جس کے بعد کچھ آپریشنز کے ساتھ ایک پورا بلاک ہوتا ہے:
int count = 2;
int value = switch (count) {
  case 1 -> {
     //some computational operations...
     break 12;
  }
  case 2 -> {
     //some computational operations...
     break 32;
  }
  case 3 -> {
     //some computational operations...
     break 52;
  }
  default -> {
     //some computational operations...
     break 0;
  }
};
ٹھیک ہے، اگر کچھ معاملات میں واپسی کی قیمت ایک جیسی ہو تو کیا ہوگا؟ یہ پتہ چلتا ہے کہ ہمارے پاس اصل میں کچھ مختلف اقدار کے لئے ایک جیسے معاملات ہیں۔ یہاں یہ ہے کہ جاوا 12 میں نئی ​​خصوصیات کا استعمال کرتے ہوئے اسے کیسے مختصر کیا جا سکتا ہے:
int count = 2;
int value = switch (count) {
  case 1, 3, 5 -> 12;
  case 2, 4, 6 -> 52;
  default -> 0;
};

جاوا 13 میں سوئچ کریں۔

جاوا 13 میں، سوئچ کے قدر واپس کرنے کا طریقہ بدل گیا ہے۔ اگر جاوا 12 میں ہم نے وقفے کے بعد واپسی کی قیمت لکھی، جو ہمارے لیے سوئچ بلاک کے لیے واپسی کے طور پر کام کرتی ہے، اب ہم لفظ yield کا استعمال کرتے ہوئے قدر واپس کریں گے ۔ آئیں دیکھیں:
int value = switch (count) {
  case 1:
     yield 12;
  case 2:
     yield 32;
  case 3:
     yield 52;
  default:
     yield 0;
};
اسی وقت، جاوا 12 میں بریک ٹو ریٹرن کا استعمال کرتے ہوئے لکھا گیا کوڈ کمپائل نہیں ہوگا (( جاوا میں بیان سوئچ کریں - 3بریک استعمال کیا جائے گا، لیکن ان حالات میں جہاں ہمیں کچھ بھی واپس کرنے کی ضرورت نہیں ہے۔

کل

  • کیس سٹیٹمنٹ کا استعمال کریں جب دو سے زیادہ برانچیں ہوں تاکہ آپ کے کوڈ کو if ڈھانچے کے ساتھ بے ترتیبی سے بچایا جا سکے۔
  • بریک کال کے ساتھ مخصوص قدر (کیس بلاک) کے مطابق ہر برانچ کے منطقی بلاک کو ختم کرنا نہ بھولیں ۔
  • کچھ قدیم اقسام کے علاوہ، سوئچ اسٹیٹمنٹ Enum اور String کی اقسام کو اظہار کے طور پر بھی استعمال کر سکتا ہے ۔
  • پہلے سے طے شدہ بلاک کو یاد رکھیں - اسے غیر منصوبہ بند انتخابی اقدار کو سنبھالنے کے لیے استعمال کریں۔
  • کارکردگی کو بہتر بنانے کے لیے، سب سے عام انتخاب کے ساتھ کوڈ کی شاخوں کو سوئچ بلاک کے آغاز میں منتقل کریں۔
  • کیس سلیکشن بلاک کے آخر میں وقفے کو ہٹا کر "آپٹیمائزیشن" سے پریشان نہ ہوں - اس طرح کے کوڈ کو سمجھنا مشکل ہے، اور نتیجے کے طور پر، اس کی نشوونما کے دوران برقرار رکھنا مشکل ہے۔
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION