$ sudo teach IT
МОДУЛЬ 3 · УРОК 5

switch: современный и классический

Когда нужно сравнить одну переменную со множеством значений — цепочка if/else if становится громоздкой. switch — компактная и читаемая альтернатива. А в современной Java (14+) switch стал ещё мощнее.

⏱ ~20 минут 🎓 Для начинающих 📌 Модуль 3

📋 Классический switch с break

Классический switch сравнивает переменную со значениями. Каждый case — это возможное значение:

public class ClassicSwitch {
    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;
            case 6:
                System.out.println("Суббота");
                break;
            case 7:
                System.out.println("Воскресенье");
                break;
            default:
                System.out.println("Неверный день");
                break;
        }
    }
}

Важные моменты:

  • break — обязателен! Без него выполнение «проваливается» в следующий case (fall-through)
  • default — необязательный, аналог else. Выполняется если ни один case не подошёл
  • Сравнение идёт по значению переменной
// Fall-through без break:
int num = 2;
switch (num) {
    case 1:
        System.out.println("Один");
        // break пропущен — выполнение продолжится!
    case 2:
        System.out.println("Два");
        // break пропущен!
    case 3:
        System.out.println("Три");
        break;
}
// Выведет: Два, Три (оба case выполнятся!)

🚫 Всегда ставьте break! Fall-through — редко нужен и часто является ошибкой. Если вам нужен fall-through — добавьте комментарий.

🏹 switch-выражения (Java 14+)

Новый синтаксис с оператором -> и yield. Без break, без fall-through, компактнее:

public class ModernSwitch {
    public static void main(String[] args) {
        int day = 3;

        String name = switch (day) {
            case 1 -> "Понедельник";
            case 2 -> "Вторник";
            case 3 -> "Среда";
            case 4 -> "Четверг";
            case 5 -> "Пятница";
            case 6, 7 -> "Выходной";  // Несколько значений!
            default -> "Неверный день";
        };

        System.out.println(name);  // Среда

        // С блоком кода и yield:
        String parity = switch (day) {
            case 2, 4, 6 -> "чётный";
            case 1, 3, 5, 7 -> "нечётный";
            default -> "неверный";
        };
        System.out.println("День " + day + " — " + parity);
    }
}

Преимущества нового синтаксиса:

  • Нет break — каждый case отдельный
  • Нет fall-through — компилятор поймает забытый case
  • switch может быть выражением (возвращать значение)
  • Несколько значений через запятую: case 6, 7 ->

🎯 Когда switch лучше if-else

  • Когда сравниваете одну переменную со множеством значений
  • Когда >3 вариантов — switch чище
  • Для enum-значений — switch идеален
  • Для строк (Java 7+) — тоже работает

if-else лучше, когда:

  • Условия сложные (диапазоны, комбинированные проверки)
  • Нужно сравнить разные переменные
  • Нужны boolean-операторы (&&, ||)

📝 Строка в switch

public class StringSwitch {
    public static void main(String[] args) {
        String command = "start";

        switch (command) {
            case "start":
                System.out.println("Запуск");
                break;
            case "stop":
                System.out.println("Остановка");
                break;
            case "restart":
                System.out.println("Перезапуск");
                break;
            default:
                System.out.println("Неизвестная команда");
        }
    }
}

Switch по строкам сравнивает через equals() (не через ==). Это безопасно.

✅ Итоги урока

  • Классический switch: case значение: ... break;
  • Современный switch (Java 14+): case значение -> результат;
  • Всегда ставьте break (классический) или используйте -> (современный)
  • switch по строкам и enum работает с Java 7+
  • Несколько значений: case 6, 7 -> "Выходной";
  • switch может быть выражением и возвращать значение

Далее: Практика — калькулятор на условиях →

Проверяем понимание

3 вопроса

День недели

Premium