← Назад к вопросам

Что такое enum?

2.0 Middle🔥 131 комментариев
#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Enum — перечисления в Java

Enum (перечисление) — это **специальный тип данных, который представляет набор заранее определённых констант**. Enum позволяет создавать типобезопасные наборы значений и часто используется для представления состояний, ролей, статусов и других фиксированных множеств значений.

Основные характеристики enum

Типобезопасность: Компилятор проверяет, что используются только допустимые значения.

Удобство: Перечисления легче читать и поддерживать, чем строки или числа.

Синглтоны: Каждый элемент enum — это уникальный объект, который существует один раз в памяти.

Сравнение: Можно использовать == вместо equals(), так как объекты уникальны.

Простой пример enum

// Определение перечисления статусов заказа
public enum OrderStatus {
    PENDING,      // В ожидании
    PROCESSING,   // В обработке
    SHIPPED,      // Отправлен
    DELIVERED,    // Доставлен
    CANCELLED     // Отменён
}

// Использование enum
public class Order {
    private String orderId;
    private OrderStatus status;
    
    public Order(String orderId) {
        this.orderId = orderId;
        this.status = OrderStatus.PENDING;
    }
    
    public void updateStatus(OrderStatus newStatus) {
        this.status = newStatus;
    }
    
    public boolean isDelivered() {
        return status == OrderStatus.DELIVERED;
    }
}

Enum с полями и методами

Enum может содержать свои поля, конструкторы и методы, что делает его более мощным инструментом:

public enum UserRole {
    ADMIN("Администратор", 3),
    MODERATOR("Модератор", 2),
    USER("Пользователь", 1);
    
    private final String displayName;
    private final int priority;
    
    // Конструктор enum
    UserRole(String displayName, int priority) {
        this.displayName = displayName;
        this.priority = priority;
    }
    
    // Методы enum
    public String getDisplayName() {
        return displayName;
    }
    
    public int getPriority() {
        return priority;
    }
    
    public boolean isAdmin() {
        return this == ADMIN;
    }
}

// Использование
public class User {
    private String username;
    private UserRole role;
    
    public User(String username, UserRole role) {
        this.username = username;
        this.role = role;
    }
    
    public void printRoleInfo() {
        System.out.println("User role: " + role.getDisplayName() + 
                          ", Priority: " + role.getPriority());
    }
}

Enum с абстрактными методами

Enum может реализовывать интерфейсы и определять поведение для каждого значения:

public enum PaymentMethod {
    CREDIT_CARD {
        @Override
        public void process(double amount) {
            System.out.println("Processing credit card payment: " + amount);
        }
    },
    PAYPAL {
        @Override
        public void process(double amount) {
            System.out.println("Processing PayPal payment: " + amount);
        }
    },
    BANK_TRANSFER {
        @Override
        public void process(double amount) {
            System.out.println("Processing bank transfer: " + amount);
        }
    };
    
    public abstract void process(double amount);
}

// Использование
PaymentMethod method = PaymentMethod.CREDIT_CARD;
method.process(99.99);

Итерация по enum

public class StatusProcessor {
    public static void printAllStatuses() {
        // values() возвращает массив всех значений enum
        for (OrderStatus status : OrderStatus.values()) {
            System.out.println("Status: " + status);
        }
    }
    
    public static void main(String[] args) {
        // Получение enum по имени
        OrderStatus status = OrderStatus.valueOf("PENDING");
        System.out.println("Status name: " + status.name());
        System.out.println("Status ordinal: " + status.ordinal());
        
        printAllStatuses();
    }
}

Enum в switch statement

Enum отлично работает в switch блоках благодаря типобезопасности:

public class OrderProcessor {
    public void handleOrder(Order order) {
        switch (order.getStatus()) {
            case PENDING:
                System.out.println("Preparing order...");
                break;
            case PROCESSING:
                System.out.println("Order is being processed...");
                break;
            case SHIPPED:
                System.out.println("Order has been shipped!");
                break;
            case DELIVERED:
                System.out.println("Order delivered successfully!");
                break;
            case CANCELLED:
                System.out.println("Order was cancelled");
                break;
        }
    }
}

Enum и DatabaseQuery

Enum часто используется в базе данных для хранения статусов:

public class UserRepository {
    public List<User> findUsersByRole(UserRole role) {
        // SQL query с использованием enum
        String query = "SELECT * FROM users WHERE role = ?";
        // Передаём role.name() или role.ordinal()
        return queryDatabase(query, role.name());
    }
}

Преимущества enum

  • Типобезопасность: Ошибки выявляются на этапе компиляции
  • Читаемость: Код более понятен, чем с числами или строками
  • Синглтоны: Гарантия единственности экземпляра для каждого значения
  • Производительность: Быстрое сравнение через ==
  • Сохранение состояния: Каждый элемент может иметь свои данные

Когда использовать enum

  • Фиксированные наборы значений (статусы, роли, направления)
  • Константы, которые нужно часто сравнивать
  • Состояния в конечных автоматах (FSM)
  • Конфигурационные опции
  • Перечень допустимых действий

Заключение

Enum — это мощный инструмент для создания типобезопасного, читаемого и удобного кода в Java. Правильное использование enum значительно улучшает качество приложения и упрощает поддержку кода.