دستور switch یکی از پنج دستور کنترل جریان موجود در زبان جاوا است. این دستور به هر تعداد مسیر اجرا اجازه میدهد. دستور switch یک متغیر انتخابگر را بهعنوان آرگومان میگیرد و از مقدار این متغیر برای انتخاب مسیری که اجرا خواهد شد استفاده میکند.
باید نوع متغیر انتخابگر خود را از میان انواع زیر انتخاب کنید:
byte، short، char و intCharacter، Byte، Short و IntegerStringشایان ذکر است که انواع اولیه زیر نمیتوانند بهعنوان نوع متغیر انتخابگر استفاده شوند: boolean، long، float و double.
بیایید اولین نمونه از دستور switch را ببینیم:
int month = 8;
switch (month) {
case 1: System.out.println("January"); break;
case 2: System.out.println("February"); break;
case 3: System.out.println("March"); break;
case 4: System.out.println("April"); break;
case 5: System.out.println("May"); break;
case 6: System.out.println("June"); break;
case 7: System.out.println("July"); break;
case 8: System.out.println("August"); break;
case 9: System.out.println("September"); break;
case 10: System.out.println("October"); break;
case 11: System.out.println("November"); break;
case 12: System.out.println("December"); break;
default: break;
}
بدنه دستور switch بهعنوان بلوک switch شناخته میشود. یک دستور در بلوک switch میتواند با یک یا چند برچسب case یا default برچسبگذاری شود. دستور switch عبارتش را ارزیابی میکند، سپس همه دستوراتی که بعد از برچسب case مطابق قرار دارند را اجرا میکند.
ممکن است متوجه استفاده از کلیدواژه break شده باشید. هر دستور break دستور switch محصورشده را خاتمه میدهد. جریان اجرا با اولین دستور بعد از بلوک switch ادامه مییابد. دستورات break ضروری هستند زیرا بدون آنها، دستورات در بلوکهای switch fall through (عبور) میکنند. همه دستورات بعد از برچسب case مطابق به ترتیب اجرا میشوند، صرفنظر از عبارات برچسبهای case بعدی، تا زمانی که با دستور break مواجه شوند.
کد زیر از fall through برای پر کردن لیست futureMonths استفاده میکند:
List<String> futureMonths = new ArrayList<>();
switch (month) {
case 1: futureMonths.add("January");
case 2: futureMonths.add("February");
case 3: futureMonths.add("March");
case 4: futureMonths.add("April");
case 5: futureMonths.add("May");
case 6: futureMonths.add("June");
case 7: futureMonths.add("July");
case 8: futureMonths.add("August");
case 9: futureMonths.add("September");
case 10: futureMonths.add("October");
case 11: futureMonths.add("November");
case 12: futureMonths.add("December");
break;
default: break;
}
از نظر فنی، break آخر الزامی نیست زیرا جریان از دستور switch خارج میشود. اما استفاده از break توصیه میشود تا تغییر کد آسانتر و کمخطاتر باشد.
بخش default مقادیری را مدیریت میکند که صراحتاً توسط هیچ بخش caseای مدیریت نمیشوند.
نمونه کد زیر نشان میدهد چگونه یک دستور میتواند چندین برچسب case داشته باشد. این کد تعداد روزهای یک ماه خاص را محاسبه میکند:
int numDaysInMonth;
switch (month) {
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
numDaysInMonth = 31;
break;
case 4: case 6: case 9: case 11:
numDaysInMonth = 30;
break;
case 2:
numDaysInMonth = 28;
break;
default:
numDaysInMonth = 0;
break;
}
این کد یک دستور برای بیش از یک case دارد.
تصمیمگیری در مورد استفاده از دستورات if-then-else یا دستور switch بر اساس خوانایی و عبارتی است که دستور آن را آزمایش میکند. دستور if-then-else میتواند عبارات را بر اساس محدودههای مقادیر یا شروط آزمایش کند، در حالی که دستور switch فقط عبارات را بر اساس یک عدد صحیح، مقدار شمارشی (enum) یا شیء String آزمایش میکند.
به عنوان مثال، کد زیر میتواند با دستور switch نوشته شود:
public String getSortAlgorithmType(int elementCount) {
String sortType;
if (elementCount <= 1) {
sortType = "Trivial case";
} else if (elementCount <= 15) {
sortType = "Quadratic sort (pick one)";
} else if (elementCount <= 2147483646) {
sortType = "O(n log n) sort (pick one)";
} else {
sortType = "O(n^2) sort (quadratic sort is probably your only option)";
}
return sortType;
}
از طرف دیگر، کد زیر نمیتواند با دستور switch نوشته شود، زیرا دستورات switch از برچسبهایی از نوع boolean پشتیبانی نمیکنند:
boolean result;
if (elementCount < 0) {
result = false;
} else {
result = true;
}
از Java SE 7 به بعد، میتوانید از شیء String در عبارت دستور switch استفاده کنید. نمونه کد زیر شماره ماه را بر اساس مقدار String با نام month نمایش میدهد:
String month = "JAN";
switch (month) {
case "JAN": IO.println("January"); break;
case "FEB": IO.println("February"); break;
case "MAR": IO.println("March"); break;
case "APR": IO.println("April"); break;
case "MAY": IO.println("May"); break;
case "JUN": IO.println("June"); break;
case "JUL": IO.println("July"); break;
case "AUG": IO.println("August"); break;
case "SEP": IO.println("September"); break;
case "OCT": IO.println("October"); break;
case "NOV": IO.println("November"); break;
case "DEC": IO.println("December"); break;
default: IO.println("Invalid month"); break;
}
String در عبارت switch با عبارات مرتبط با هر برچسب case با استفاده از متد String.equals() مقایسه میشود. برای اینکه این مثال هر ماهی را بدون توجه به بزرگی و کوچکی حروف بپذیرد، month به حروف کوچک تبدیل میشود (با متد toLowerCase()) و همه رشتههای مرتبط با برچسبهای case به حروف کوچک هستند.
متغیر انتخابگر دستور switch میتواند یک شیء باشد، بنابراین این شیء میتواند null باشد. باید کد خود را در برابر متغیرهای انتخابگر null محافظت کنید، زیرا در این حالت دستور switch خطای NullPointerException تولید خواهد کرد:
String test = null;
switch (test) {
case "A":
IO.println("Matched A");
break;
default:
IO.println("No match");
break;
}
// Throws NullPointerException at runtimeاین محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: https://dev.java/learn/