Многие языки используют не только условную конструкцию if, но и switch в дополнение к ней. Конструкция switch — это специализированная версия if, созданная для некоторых особых ситуаций.
Например, ее стоит использовать там, где есть цепочка if else с проверками на равенство:
if (status.equals("processing")) {
// Делаем раз
} else if (status.equals("paid")) {
// Делаем два
} else if (status.equals("new")) {
// Делаем три
} else {
// Делаем четыре
}
Эта составная проверка обладает одной отличительной чертой: каждая ветка здесь — это проверка значения переменной status. Конструкция switch позволяет записать этот код короче и выразительнее:
switch (status) {
case "processing":
// Делаем раз
break;
case "paid":
// Делаем два
break;
case "new":
// Делаем три
break;
default: // else
// Делаем четыре
}
С точки зрения количества элементов, switch — довольно сложная конструкция. В нее входят:
- Внешнее описание с ключевым словом
switch. В нем два элемента:- Переменная, по значениям которой
switchбудет выбирать поведение - Фигурные скобки для вариантов выбора
- Переменная, по значениям которой
- Конструкции
caseиdefault, внутри которых описывается поведение для разных значений рассматриваемой переменной. Каждыйcaseсоответствуетif, как в примере выше. Здесьdefault— это особая ситуация, соответствующая веткеelseв условных конструкциях. Как и в случае сelse, указыватьdefaultнеобязательно - Конструкция
break, который предотвращает «проваливание». Если ее не указать, то после выполнения нужногоcase, выполнение перейдет к следующемуcase. Этот цикл будет повторяться до ближайшегоbreakили до концаswitch
Фигурные скобки в switch не определяют блок кода, как это было в других местах. Внутри допускается только тот синтаксис, который показан выше — там можно использовать case или default. А вот внутри каждого case (и default) ситуация другая. Здесь можно выполнять любой произвольный код:
switch (count) {
case 1:
// Делаем что-то полезное
break;
case 2:
// Делаем что-то полезное
break;
default:
// Что-то делаем
}
Иногда результат, полученный внутри case — это конец выполнения метода, содержащего switch. В таком случае его нужно как-то вернуть наружу. Для решения этой задачи есть два способа.
Первый способ — можно создать переменную перед switch, заполнить ее в case и затем вернуть значение этой переменной наружу:
class App {
public static String getExplanation(int count) {
// Объявляем переменную
String result;
// Заполняем
switch(count) {
case 1:
result = "one";
break;
case 2:
result = "two";
break;
default:
result = null;
}
// Возвращаем
return result;
}
}
Второй способ проще и короче. Вместо создания переменной можно использовать case, внутри которого можно делать обычный возврат из метода. После return никакой код не выполняется, так что мы можем избавиться от break:
class App {
public static String getExplanation(int count) {
switch (count) {
case 1:
return "one";
case 2:
return "two";
default:
return null;
}
}
}
Switch хоть и встречается в коде, но технически всегда можно обойтись без него.
Польза этой конструкции в том, что она лучше выражает намерение программиста, когда нужно проверять конкретные значения переменной. В отличие от блоков else if, код со switch становится немного длиннее, но читать его гораздо проще.