Выражения switch с перечислениями
Используйте современные выражения switch с перечислениями для ясного и полного ветвления.
«Выражения switch с перечислениями» — бесплатный урок Java Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.
Выражения выбора с перечислениями
Выражения выбора (Java 14+) с перечислениями обеспечивают исчерпывающую и лаконичную маршрутизацию по типу. Если учтены все константы перечисления, default не требуется.
Традиционный оператор выбора
Классический оператор выбора работает с перечислениями, но требует break, чтобы предотвратить переход к следующей ветви.
enum Severity { LOW, MEDIUM, HIGH, CRITICAL }
Severity s = Severity.HIGH;
String action;
switch (s) {
case LOW:
action = "Log and monitor";
break;
case MEDIUM:
action = "Notify on-call team";
break;
case HIGH:
action = "Page engineer immediately";
break;
case CRITICAL:
action = "Activate incident response";
break;
default:
action = "Unknown";
}
System.out.println(action); // Page engineer immediatelyВыражение выбора с метками-стрелками
Выражения выбора с метками-стрелками устраняют переход к следующей ветви и необходимость в break. Они вычисляют значение и требуют обработки всех вариантов.
enum Severity { LOW, MEDIUM, HIGH, CRITICAL }
Severity s = Severity.HIGH;
String action = switch (s) {
case LOW -> "Log and monitor";
case MEDIUM -> "Notify on-call team";
case HIGH -> "Page engineer immediately";
case CRITICAL -> "Activate incident response";
// no default needed — all cases covered
};
System.out.println(action); // Page engineer immediatelyВыражение выбора с блоками
Если логика варианта требует нескольких операторов, используйте блок с yield, чтобы получить результирующее значение.
enum DayOfWeek { MON, TUE, WED, THU, FRI, SAT, SUN }
DayOfWeek day = DayOfWeek.FRI;
int hoursOpen = switch (day) {
case MON, TUE, WED, THU -> 8;
case FRI -> {
System.out.println("Half day on Friday!");
yield 4; // yield returns value from block
}
case SAT, SUN -> 0;
};
System.out.println("Hours open: " + hoursOpen); // Hours open: 4Группировка нескольких вариантов
Несколько констант перечисления могут использовать один и тот же вариант case, если разделить их запятыми.
enum Season { SPRING, SUMMER, FALL, WINTER }
Season season = Season.SUMMER;
String activity = switch (season) {
case SPRING, FALL -> "Hike in the mountains";
case SUMMER -> "Beach vacation";
case WINTER -> "Ski at the resort";
};
System.out.println(activity); // Beach vacationВозврат из методов с помощью switch
Выражения switch отлично подходят для операторов return в методах и делают намерение кода очевидным.
enum Priority { LOW, NORMAL, HIGH, URGENT }
static int getSlaHours(Priority p) {
return switch (p) {
case LOW -> 72;
case NORMAL -> 24;
case HIGH -> 4;
case URGENT -> 1;
};
}
System.out.println(getSlaHours(Priority.URGENT)); // 1
System.out.println(getSlaHours(Priority.LOW)); // 72Выражение switch в потоке
Выражения switch можно использовать внутри операций с потоками для аккуратного преобразования каждого элемента.
import java.util.*;
import java.util.stream.*;
enum Status { PENDING, ACTIVE, CLOSED }
record Account(String id, Status status) {}
List<Account> accounts = List.of(
new Account("A1", Status.ACTIVE),
new Account("A2", Status.PENDING),
new Account("A3", Status.CLOSED)
);
accounts.stream()
.map(a -> a.id() + ": " + switch (a.status()) {
case ACTIVE -> "\u2705 Live";
case PENDING -> "\u23f3 Awaiting activation";
case CLOSED -> "\u274c Deactivated";
})
.forEach(System.out::println);Проверка полноты на этапе компиляции
Компилятор требует обработать все константы перечисления. Добавление новой константы в перечисление приводит к ошибкам компиляции во всех выражениях switch, которые её не обрабатывают.
enum Color { RED, GREEN, BLUE } // add YELLOW here → compile error below
Color c = Color.GREEN;
// This switch is exhaustive for RED, GREEN, BLUE
// If you add YELLOW to the enum without adding a case here,
// the compiler will report an error.
String hex = switch (c) {
case RED -> "#FF0000";
case GREEN -> "#00FF00";
case BLUE -> "#0000FF";
};
System.out.println(hex); // #00FF00Switch с default для безопасности
При использовании оператора switch, а не выражения, или если switch намеренно охватывает только некоторые варианты, добавьте вариант default.
enum Feature { DARK_MODE, PUSH_NOTIFICATIONS, ANALYTICS, BETA_FEATURE }
static boolean isEnabled(Feature feature) {
return switch (feature) {
case DARK_MODE, PUSH_NOTIFICATIONS -> true;
case ANALYTICS -> false;
default -> {
System.out.println("Unknown feature: " + feature);
yield false;
}
};
}
System.out.println(isEnabled(Feature.DARK_MODE)); // true
System.out.println(isEnabled(Feature.BETA_FEATURE)); // falseПрактика: жизненный цикл заказа
Полный конечный автомат состояний жизненного цикла заказа, использующий выражение switch для определения допустимых переходов.
enum OrderState { CART, PENDING, CONFIRMED, SHIPPED, DELIVERED, CANCELLED }
static Set<OrderState> allowedTransitions(OrderState from) {
return switch (from) {
case CART -> Set.of(OrderState.PENDING, OrderState.CANCELLED);
case PENDING -> Set.of(OrderState.CONFIRMED, OrderState.CANCELLED);
case CONFIRMED -> Set.of(OrderState.SHIPPED);
case SHIPPED -> Set.of(OrderState.DELIVERED);
case DELIVERED, CANCELLED -> Set.of(); // terminal states
};
}
System.out.println(allowedTransitions(OrderState.PENDING));
// [CONFIRMED, CANCELLED]Switch для String и перечисления
Переключение по String требует проверки на null и учитывает регистр. Переключение по перечислению безопасно относительно null (при значении null возникает NPE) и типобезопасно — если набор значений известен заранее, предпочтительнее использовать перечисления.
// String switch — fragile
String role = "admin";
String label = switch (role.toLowerCase()) {
case "admin" -> "Administrator";
case "guest" -> "Guest User";
default -> "Unknown";
};
// Enum switch — type-safe
enum Role { ADMIN, GUEST }
Role r = Role.ADMIN;
String label2 = switch (r) {
case ADMIN -> "Administrator";
case GUEST -> "Guest User";
};
System.out.println(label2); // AdministratorБыстрая проверка
У вас есть перечисление с 4 константами, и вы пишете выражение switch, охватывающее все 4. Что произойдёт, если добавить в перечисление 5-ю константу?
Итоги: выражения switch с перечислениями
Главное:
- Выражения switch со стрелочными метками устраняют необходимость в break и исключают проваливание в следующую ветвь
- Используйте yield, чтобы вернуть значение из блочного варианта
- Группируйте несколько констант через запятые: case A, B ->
- Для полного выражения switch не нужен default, если обработаны все константы
- Добавление новой константы перечисления приводит к ошибкам компиляции в полных выражениях switch
- Выражения switch отлично подходят для операций map() с потоками
Часто задаваемые вопросы
Урок «Выражения switch с перечислениями» бесплатный?
Да — полный текст урока «Выражения switch с перечислениями» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.
Чему я научусь в уроке «Выражения switch с перечислениями»?
Используйте современные выражения switch с перечислениями для ясного и полного ветвления. Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Java Academy?
Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Выражения switch с перечислениями»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Java Academy?
Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Определение и использование перечислений
- Перечисления с полями и методами
- Выражения switch с перечислениями
- EnumSet и EnumMap