Оператор 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.