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 -> результатЗаЗамовчуванням;
}
-> і
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 двічі не можна — компілятор одразу повідомить про помилку.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ