Java: Конструкция Switch
Многие языки используют не только условную конструкцию 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 (значение) {
│
├── case "a" → блок 1
├── case "b" → блок 2
├── case "c" → блок 3
└── default → блок по умолчанию
}С точки зрения количества элементов 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:
// Что-то делаем
}Возврат значения из switch
Иногда результат, полученный внутри case, завершает работу метода, который содержит switch. Тогда его нужно как-то вернуть наружу. Для этого есть два способа.
Первый способ создает переменную перед switch, заполняет ее в case и в конце возвращает наружу:
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 тут не нужен:
public static String getExplanation(int count) {
switch (count) {
case 1:
return "one";
case 2:
return "two";
default:
return null;
}
}switch-выражение
У классического switch есть современная форма со стрелочным синтаксисом. Она называется switch-выражение и сразу возвращает значение. Каждая ветка записывается как case значение -> результат;. Здесь не нужны ни break, ни проваливание между ветками:
public static String getExplanation(int count) {
return switch (count) {
case 1 -> "one";
case 2 -> "two";
default -> null;
};
}Одна ветка отрабатывает несколько значений, если перечислить их через запятую:
String season =
switch (month) {
case 12, 1, 2 -> "winter";
case 3, 4, 5 -> "spring";
case 6, 7, 8 -> "summer";
default -> "autumn";
};switch встречается в коде, но технически без него всегда можно обойтись. Польза этой конструкции в том, что она лучше выражает намерение программиста, когда нужно проверять конкретные значения переменной. По сравнению с блоками else if код со switch читается понятнее.
Задание
Реализуйте метод getNumberExplanation(), который принимает на вход число и возвращает объяснение этого числа. Если для числа нет объяснения, то возвращается just a number. Объяснения есть только для следующих чисел:
- 666 - devil number
- 42 - answer for everything
- 7 - prime number
Примеры вызова функции:
App.getNumberExplanation(8); // just a number
App.getNumberExplanation(666); // devil number
App.getNumberExplanation(42); // answer for everything
App.getNumberExplanation(7); // prime numberJava: Конструкция Switch
Многие языки используют не только условную конструкцию 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 (значение) {
│
├── case "a" → блок 1
├── case "b" → блок 2
├── case "c" → блок 3
└── default → блок по умолчанию
}С точки зрения количества элементов 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:
// Что-то делаем
}Возврат значения из switch
Иногда результат, полученный внутри case, завершает работу метода, который содержит switch. Тогда его нужно как-то вернуть наружу. Для этого есть два способа.
Первый способ создает переменную перед switch, заполняет ее в case и в конце возвращает наружу:
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 тут не нужен:
public static String getExplanation(int count) {
switch (count) {
case 1:
return "one";
case 2:
return "two";
default:
return null;
}
}switch-выражение
У классического switch есть современная форма со стрелочным синтаксисом. Она называется switch-выражение и сразу возвращает значение. Каждая ветка записывается как case значение -> результат;. Здесь не нужны ни break, ни проваливание между ветками:
public static String getExplanation(int count) {
return switch (count) {
case 1 -> "one";
case 2 -> "two";
default -> null;
};
}Одна ветка отрабатывает несколько значений, если перечислить их через запятую:
String season =
switch (month) {
case 12, 1, 2 -> "winter";
case 3, 4, 5 -> "spring";
case 6, 7, 8 -> "summer";
default -> "autumn";
};switch встречается в коде, но технически без него всегда можно обойтись. Польза этой конструкции в том, что она лучше выражает намерение программиста, когда нужно проверять конкретные значения переменной. По сравнению с блоками else if код со switch читается понятнее.
Задание
Реализуйте метод getNumberExplanation(), который принимает на вход число и возвращает объяснение этого числа. Если для числа нет объяснения, то возвращается just a number. Объяснения есть только для следующих чисел:
- 666 - devil number
- 42 - answer for everything
- 7 - prime number
Примеры вызова функции:
App.getNumberExplanation(8); // just a number
App.getNumberExplanation(666); // devil number
App.getNumberExplanation(42); // answer for everything
App.getNumberExplanation(7); // prime numberВаше упражнение проверяется по этим тестам
import static org.assertj.core.api.Assertions.assertThat;
class AppTest {
public static void main(String[] args) {
assertThat(App.getNumberExplanation(0)).isEqualTo("just a number");
assertThat(App.getNumberExplanation(666)).isEqualTo("devil number");
assertThat(App.getNumberExplanation(42)).isEqualTo("answer for everything");
assertThat(App.getNumberExplanation(7)).isEqualTo("prime number");
}
}Решение учителя откроется через:
20:00
