Enum
Иногда значение может быть только одним из заранее известных вариантов: например,
статус заказа, уровень приоритета или состояние процесса.
Для таких случаев в 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, когда набор вариантов действительно фиксирован.
Так код хранит не случайную строку или число, а значение с понятным типом и заранее известными допустимыми вариантами.