Оператор switch в Java
Оператор switch сравнивает значение выражения с набором констант (case) и выполняет соответствующий блок кода. Это удобная альтернатива длинной лестнице if / else if для случаев, когда мы проверяем одну переменную на равенство нескольким значениям.
В Java switch работает с типами byte, short, int, char, String, enum и обёртками этих типов. Начиная с Java 14 доступна короткая форма со стрелкой ->, которая не требует break и сразу выходит из switch.
Синтаксис
// Классический
switch (выражение) {
case значение1:
// ...
break;
case значение2:
// ...
break;
default:
// ...
}
// Со стрелкой (Java 14+)
switch (выражение) {
case значение1 -> { /* ... */ }
case значение2 -> { /* ... */ }
default -> { /* ... */ }
}
Пример 1. День недели
public class DayOfWeek {
public static void main(String[] args) {
int day = 3;
switch (day) {
case 1: System.out.println("Понедельник"); break;
case 2: System.out.println("Вторник"); break;
case 3: System.out.println("Среда"); break;
case 4: System.out.println("Четверг"); break;
case 5: System.out.println("Пятница"); break;
default: System.out.println("Выходной");
}
}
}
Вывод:
Среда
Пример 2. Fall-through (намеренное «проваливание»)
public class FallThrough {
public static void main(String[] args) {
int month = 4;
String season;
switch (month) {
case 12: case 1: case 2:
season = "Зима"; break;
case 3: case 4: case 5:
season = "Весна"; break;
case 6: case 7: case 8:
season = "Лето"; break;
default:
season = "Осень";
}
System.out.println("Месяц " + month + " — " + season);
}
}
Вывод:
Месяц 4 — Весна
Пример 3. switch по String
public class CommandSwitch {
public static void main(String[] args) {
String cmd = "STOP";
switch (cmd) {
case "GO": System.out.println("Поехали"); break;
case "STOP": System.out.println("Стоп"); break;
case "BACK": System.out.println("Назад"); break;
default: System.out.println("Неизвестная команда");
}
}
}
Вывод:
Стоп
Пример 4. switch со стрелкой
public class ArrowSwitch {
public static void main(String[] args) {
char c = 'B';
switch (c) {
case 'A' -> System.out.println("Высокая оценка");
case 'B' -> System.out.println("Хорошая оценка");
case 'C' -> System.out.println("Средняя оценка");
default -> System.out.println("Низкая оценка");
}
}
}
Вывод:
Хорошая оценка
Пример 5. switch как выражение (возврат значения)
public class SwitchExpr {
public static void main(String[] args) {
int day = 6;
String type = switch (day) {
case 1, 2, 3, 4, 5 -> "Будни";
case 6, 7 -> "Выходные";
default -> "Неизвестно";
};
System.out.println("День " + day + " — " + type);
}
}
Вывод:
День 6 — Выходные
Пример 6. Управление светофором
public class TrafficLight {
public static void main(String[] args) {
String color = "ЖЁЛТЫЙ";
switch (color) {
case "ЗЕЛЁНЫЙ" -> System.out.println("Можно ехать");
case "ЖЁЛТЫЙ" -> System.out.println("Приготовиться");
case "КРАСНЫЙ" -> System.out.println("Стоп");
default -> System.out.println("Сигнал не распознан");
}
}
}
Вывод:
Приготовиться
Подводные камни
Забыли break. В классической форме без
breakуправление «проваливается» в следующийcase— частая причина багов.Тип switch. Нельзя использовать
long,float,doubleили произвольные объекты — только указанные выше типы.null в switch (String/enum). Если значение
null, классическийswitchброситNullPointerException. Проверяйте наnullдо switch.case-метки только константы. Каждый
caseдолжен быть compile-time константой; нельзя писатьcase x > 5:.Объявление переменных. Внутри тела
switchобласть видимости общая — нельзя объявить одну и ту же переменную в несколькихcaseбез блока{ }.
См. также
Примечание
Лицензия и источники
Концепция описана на основе официального Java Tutorial от Oracle (https://docs.oracle.com/javase/tutorial/), Oracle Free Documentation License. Перевод, примеры и пояснения — © AlashEd Wiki.