JavaRush /Курси /JAVA 25 SELF /Розширені switch-ви...

Розширені switch-вирази

JAVA 25 SELF
Рівень 10 , Лекція 5
Відкрита

1. Що нового у switch

Якщо ви писали Java до версії 14, switch виглядав приблизно так:

switch (day) 
{
    case MONDAY:
        System.out.println("Початок тижня!");
        break;
    case FRIDAY:
        System.out.println("П’ятниця, ура!");
        break;
    default:
        System.out.println("Звичайний день.");
        break;
}

Здається, нічого складного, але:

  • Легко забути про break (інакше виконання перейде до наступного case).
  • Чимало повторюваного коду.
  • Щоб повернути значення, доводиться заздалегідь оголошувати змінну й присвоювати їй значення всередині кожного case.

Java 14+ сказала: «Досить». Час зробити switch зручнішим і сучаснішим.

Основні нововведення:

  • Switch став виразом, а не лише оператором — тепер він може повертати значення.
  • Новий синтаксис зі стрілкою -> замість двокрапок і break.
  • Кілька case через кому — для однакової логіки.
  • Компілятор перевіряє, що всі варіанти оброблено (особливо для enum).
  • Немає ризику «провалювання» (fall-through) — тепер це можливо лише явно.

2. Синтаксис switch-виразу


switch (значення)
{
   case A, B -> результат1;
   case C -> {
      // кілька дій
      yield результат2;
   }
   default -> результатЗаЗамовчуванням;
}
Синтаксис switch-виразу з -> і yield

Базовий приклад

Перейдемо одразу до прикладу. Ось як тепер можна повертати значення з switch:

DayOfWeek day = DayOfWeek.MONDAY;

String message = switch (day) 
{
    case MONDAY, FRIDAY, SUNDAY -> "Короткий тиждень або вихідний!";
    case TUESDAY                -> "Вівторок — день важкий.";
    case WEDNESDAY, THURSDAY    -> "Середина тижня!";
    case SATURDAY               -> "Ура, субота!";
    // Обов’язково має бути default, якщо не всі варіанти оброблені
    default                     -> "Якийсь дивний день…";
};

System.out.println(message);

Що тут відбувається:

  • switch (day) — вираз, що повертає значення.
  • Після стрілки -> вказується результат для цього case.
  • Кілька case можна об’єднати через кому.
  • Немає жодного break — Java сама визначає, де закінчується гілка.
  • Можна одразу присвоїти результат змінній message.

Приклад з числами

int code = 404;
String result = switch (code) 
{
    case 200 -> "OK";
    case 400, 404 -> "Помилка клієнта";
    case 500 -> "Помилка сервера";
    default -> "Невідомий код";
};
System.out.println(result);

Приклад із рядками

String command = "start";
String status = switch (command) 
{
    case "start" -> "Запуск!";
    case "stop" -> "Зупинка!";
    case "pause" -> "Пауза…";
    default -> "Невідома команда";
};
System.out.println(status);

Використання блоку з yield

Іноді потрібно виконати кілька дій для одного case (наприклад, зробити складніший розрахунок або записати у журнал). Для цього можна використати блок { ... } і ключове слово yield:

int n = 7;
String parity = switch (n % 2) 
{
    case 0 -> "Парне";
    case 1 -> 
    {
        System.out.println("Виявлено непарне число: " + n);
        yield "Непарне";
    }
    default -> "Щось дивне";
};
System.out.println(parity);

Важливо: у блоці обов’язково має бути yield, який повертає значення для цього case.

3. Переваги нового синтаксису

Немає потреби у break

У класичному switch забутий break — джерело помилок і неочікуваної поведінки. У новому синтаксисі break взагалі не потрібен: кожна гілка завершується автоматично.

Компілятор перевіряє обробку всіх варіантів

Якщо ви використовуєте enum і не обробили всі значення — компілятор не дозволить зібрати проєкт без default. Це робить код надійнішим.

Немає «провалювання» (fall-through)

У класичному switch, якщо забути break, виконання переходить до наступного case. У новому синтаксисі це неможливо (хіба що ви використовуєте блок із інструкціями та явно пишете break — але зазвичай у цьому немає потреби).

Код компактніший і читабельніший

Порівняйте самостійно:

До:

String result;
switch (status) {
    case "OK":
        result = "Усе добре";
        break;
    case "ERROR":
        result = "Помилка";
        break;
    default:
        result = "Невідомо";
        break;
}

Після:

String result = switch (status) {
    case "OK" -> "Усе добре";
    case "ERROR" -> "Помилка";
    default -> "Невідомо";
};

Кілька case — одна логіка

case MONDAY, FRIDAY, SUNDAY -> "Вихідний або короткий день!";

4. Порівняння з класичним switch

Особливість Класичний switch Новий switch
break обов’язковий Так Ні
Провалювання (fall-through) Так Ні
Може повертати значення Ні (лише через змінну) Так (вираз)
Кілька case через кому Ні Так
Перевірка всіх варіантів Ні Так (особливо з enum)
Компактність Багато коду Коротко й ясно
Використання з enum і рядками Так Так

5. Сумісність із enum і рядками

Приклад із enum

Припустімо, маємо перелічення:

enum DayOfWeek 
{
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

Використаємо його у новому switch:

DayOfWeek today = DayOfWeek.WEDNESDAY;

String mood = switch (today) 
{
    case MONDAY -> "Важко вставати…";
    case FRIDAY -> "Скоро вихідні!";
    case SATURDAY, SUNDAY -> "Ура, відпочинок!";
    default -> "Робочий день.";
};
System.out.println(mood);

Приклад зі String

String season = "summer";
String activity = switch (season) 
{
    case "winter" -> "Кататися на ковзанах";
    case "summer" -> "Плавати в озері";
    case "autumn" -> "Збирати гриби";
    case "spring" -> "Слухати спів птахів";
    default -> "Невідома пора року";
};
System.out.println(activity);

6. Переписуємо старий switch на новий стиль

Було:

int day = 3;
String dayName;
switch (day) 
{
    case 1:
        dayName = "Понеділок";
        break;
    case 2:
        dayName = "Вівторок";
        break;
    case 3:
        dayName = "Середа";
        break;
    default:
        dayName = "Невідомий день";
        break;
}
System.out.println(dayName);

Стало:

int day = 3;
String dayName = switch (day) 
{
    case 1 -> "Понеділок";
    case 2 -> "Вівторок";
    case 3 -> "Середа";
    default -> "Невідомий день";
};
System.out.println(dayName);

Ще приклад: кілька case — одна логіка

int score = 5;
String grade = switch (score) 
{
    case 5, 6, 7 -> "Добре";
    case 8, 9, 10 -> "Відмінно";
    default -> "Потрібно постаратися";
};
System.out.println(grade);

7. Типові помилки та особливості

Помилка № 1: відсутність default, якщо не всі варіанти оброблено. Якщо ви використовуєте switch-вираз із типом, що може набувати значень поза перерахованими case (наприклад, int або String), компілятор вимагатиме default. Для enum, якщо ви не обробили всі значення, default теж обов’язковий.

Помилка № 2: забули yield у блоці. Якщо ви використовуєте фігурні дужки для case (потрібно виконати кілька дій), не забудьте про yield — без нього компілятор видасть помилку: "Missing yield statement".

Помилка № 3: невідповідність типів. Усі гілки switch-виразу мають повертати значення одного типу; інакше компілятор не пропустить код.

Помилка № 4: дублювання значень case. Вказувати один і той самий case двічі не можна — компілятор одразу повідомить про помилку.

1
Опитування
Константи, enum і switch, рівень 10, лекція 5
Недоступний
Константи, enum і switch
Константи, enum і switch
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ