Enum

Базовый Java
≈ 2 мин чтения

Иногда значение может быть только одним из заранее известных вариантов: например, статус заказа, уровень приоритета или состояние процесса. Для таких случаев в Java есть enum — тип с фиксированным набором именованных значений.

enum OrderStatus {
    NEW,
    PAID,
    SHIPPED,
    DELIVERED
}

Каждое имя внутри OrderStatus — отдельная константа этого типа. Вместо строк вроде "paid" код теперь работает с конкретными значениями, которые проверяет компилятор.

OrderStatus status = OrderStatus.PAID;

if (status == OrderStatus.PAID) {
    System.out.println("Payment received");
}

Константы одного enum удобно сравнивать через ==: каждая из них представляет единственный объект своего значения.

Обработка значений enum

enum хорошо сочетается со switch. Внутри веток достаточно писать имена констант без имени самого типа.

String message = switch (status) {
    case NEW -> "Created";
    case PAID -> "Paid";
    case SHIPPED -> "On the way";
    case DELIVERED -> "Delivered";
};

Когда обработаны все константы, такой switch не требует ветки default. Это помогает заметить изменения: если позже в enum появится новое значение, места с полной обработкой набора придётся обновить.

Получить все константы можно через автоматически доступный метод values():

for (OrderStatus value : OrderStatus.values()) {
    System.out.println(value);
}

Обратная операция тоже возможна. valueOf() находит константу по её точному имени:

OrderStatus status = OrderStatus.valueOf("PAID");
valueOf() требует точного имени константы. Например, "PAID" подходит, а "paid" — уже другое значение строки.

Enum может хранить данные и поведение

enum — не просто список строк. Его константы являются объектами, поэтому сам тип может иметь поля, конструктор и методы. Это удобно, когда каждому варианту нужно сопоставить дополнительные данные.

enum Priority {
    LOW(1),
    MEDIUM(2),
    HIGH(3);

    private final int weight;

    Priority(int weight) {
        this.weight = weight;
    }

    int weight() {
        return weight;
    }
}

Число в скобках передаётся конструктору соответствующей константы. Теперь данные можно получать прямо из значения enum:

int weight = Priority.HIGH.weight();

Точка с запятой после списка констант нужна, когда после них объявляются поля или методы. Создать дополнительное значение через new Priority(...) нельзя: набор экземпляров задаётся самим объявлением enum.

Используй enum, когда набор вариантов действительно фиксирован. Так код хранит не случайную строку или число, а значение с понятным типом и заранее известными допустимыми вариантами.