CodeGym /وبلاگ جاوا /Random-FA /بیانیه سوئیچ جاوا
John Squirrels
مرحله
San Francisco

بیانیه سوئیچ جاوا

در گروه منتشر شد

کمی تئوری در مورد جاوا سوییچ

تصور کنید که شما یک شوالیه هستید که در یک انشعاب در جاده توقف کرده اید. اگر به چپ بروید، اسب خود را از دست خواهید داد. اگر درست پیش بروید، دانش کسب خواهید کرد. چگونه این وضعیت را در کد نشان می دهیم؟ احتمالاً می‌دانید که ما از سازه‌هایی مانند اگر-آنوقت و اگر-آنگاه-دیگر برای اتخاذ این تصمیمات استفاده می‌کنیم.
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 را دارد .
switch (ExpressionForMakingAChoice) {
           case (Value1):
               Code1;
               break;
           case (Value2):
               Code2;
               break;
...
           case (ValueN):
               CodeN;
               break;
           default:
               CodeForDefaultChoice;
               break;
       }
این بیانیه به این صورت است:
  • ExpressionForMakingAchoice ارزیابی می شود. سپس دستور switch مقدار حاصل را با ValueX بعدی مقایسه می کند (به ترتیبی که آنها فهرست شده اند).
  • اگر ExpressionForMakingAChoice با ValueX مطابقت داشته باشد، کد زیر دو نقطه اجرا می شود.
  • اگر با دستور break مواجه شد، کنترل به خارج از دستور switch منتقل می شود.
  • اگر ExpressionForMakingAChoice با هیچ ValueX مطابقت نداشته باشد، کنترل به CodeForDefaultCase منتقل می شود.
نکات مهم
  • در دستور switch، نوع ExpressionForMakingAchoice باید یکی از موارد زیر باشد:

    • بایت , کوتاه , char , int .
    • بایت ، کوتاه ، کاراکتر ، عدد صحیح (پوشش‌های انواع داده‌های اولیه).
    • رشته .
    • Enum .
  • بلوک پیش فرض اختیاری است. اگر وجود نداشته باشد و ExpressionForMakingAChoice با هیچ ValueX مطابقت نداشته باشد، هیچ اقدامی اجرا نخواهد شد.
  • دستور break الزامی نیست. در صورت عدم وجود، اجرای کد (با نادیده گرفتن مقایسه‌های بیشتر در دستورات case) تا اولین رخداد break یا تا پایان دستور switch ادامه می‌یابد .
  • اگر یک کد لازم باشد برای چندین انتخاب اجرا شود، می‌توانیم با تعیین چند عبارت case متوالی، تکرار را حذف کنیم.

حال بیایید نگاهی به نحوه استفاده از دستور switch در جاوا بیاندازیم

نگران نباشید: ما کار تئوری را تمام کردیم. پس از مشاهده نمونه های زیر، همه چیز بسیار واضح تر خواهد شد. خوب، بیایید شروع کنیم. بیایید به مثالی از نجوم مربوط به سیارات منظومه شمسی نگاه کنیم. مطابق با آخرین نگرش‌های بین‌المللی، ما پلوتو را (به دلیل ویژگی‌های مدارش) کنار گذاشته‌ایم. به یاد می آوریم که سیارات ما بر اساس فاصله آنها از خورشید به شرح زیر مرتب شده اند: عطارد، زهره، زمین، مریخ، مشتری، زحل، اورانوس و نپتون. بیایید یک روش جاوا بنویسیم که عدد ترتیبی یک سیاره (نسبت به فاصله آن از خورشید) را می گیرد و اجزای اصلی جو سیاره را به صورت 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"].
آزمایش با break: اگر همه دستورات break را حذف کنیم چه اتفاقی می‌افتد ؟ بیایید آن را امتحان کنیم:
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)) را چاپ کنیم ، در می یابیم که سیاره اصلی ما چندان قابل زندگی نیست. یا آن؟ خودتان قضاوت کنید: ["دی اکسید کربن"، "نیتروژن"، "اکسیژن"، "هیدروژن"، "هلیوم"، "متان"، "هیدروژن"، "هلیوم"] . چرا این اتفاق افتاد؟ برنامه تمام دستورات case را پس از اولین مسابقه تا پایان بلوک سوئیچ اجرا می کند .

بهینه سازی بیش از حد دستورات شکست

توجه داشته باشید که می‌توانیم روش را با ترتیب دادن متفاوت دستورات break و caseها بهبود دهیم.
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;
}
کد کمتری به نظر می رسد، درست است؟ ما تعداد کل اظهارات را با بازی با ترتیب اظهارات پرونده و گروه بندی مجدد آنها کاهش داده ایم. اکنون هر نوع گاز تنها در یک خط کد به لیست اضافه می شود. کد ارائه شده در مثال آخر فقط برای نشان دادن نحوه کار کردن است. ما نوشتن کد به این روش را توصیه نمی کنیم. اگر نویسنده چنین کد جاوا (چه رسد به برنامه نویسان دیگر) باید آن را حفظ کند، بازسازی منطق پشت تشکیل آن بلوک های case و کد اجرا شده در دستور switch برای او بسیار مشکل خواهد بود .

تفاوت با if

با توجه به شباهت‌های بیرونی دستورات if و switch ، فراموش نکنید که دستور switch یکی از موارد را بر اساس یک مقدار خاص انتخاب می‌کند، در حالی که دستور if می‌تواند هر عبارت بولی داشته باشد. این را هنگام طراحی کد خود در نظر داشته باشید.

نتیجه

  • از دستور case برای بیش از دو شاخه استفاده کنید تا کد خود را با دستورات if شلوغ نکنید.
  • فراموش نکنید که بلوک منطقی شعبه را برای هر مقدار خاص (قطعه case) با درج دستور break تکمیل کنید .
  • عبارت عبارت switch می تواند یک Enum یا String و همچنین برخی از انواع اولیه باشد .
  • بلوک پیش فرض را به خاطر بسپارید . از آن برای رسیدگی به مقادیر غیرمنتظره استفاده کنید.
  • برای بهینه سازی عملکرد، شاخه های کد مربوط به رایج ترین مقادیر را به ابتدای بلوک سوئیچ منتقل کنید .
  • با حذف عبارات break در پایان عبارات case ، در "بهینه سازی" خود غافل نشوید - درک چنین کدی دشوار است و در نتیجه نگهداری آن دشوار است.
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION