0Pricing
Java Academy · Урок

Выражения 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); // #00FF00

Switch с 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 — локальная установка не требуется.

Все уроки этого курса

  1. Определение и использование перечислений
  2. Перечисления с полями и методами
  3. Выражения switch с перечислениями
  4. EnumSet и EnumMap
← Назад к Java Academy