Карта / ООП / Enum

Enum

enum — тип с фиксированным набором значений. Вместо констант int STATUS_ACTIVE = 1 — именованные значения с типом. Компилятор проверяет, что вы не передали случайное число туда, где ожидается статус.

enum Status { ACTIVE, INACTIVE, SUSPENDED }

Status s = Status.ACTIVE;
System.out.println(s);        // "ACTIVE"
System.out.println(s.name()); // "ACTIVE"
System.out.println(s.ordinal()); // 0 — порядковый номер

Enum в switch — компилятор проверяет полноту:

String label = switch (status) {
    case ACTIVE    -> "Активен";
    case INACTIVE  -> "Неактивен";
    case SUSPENDED -> "Заблокирован";
    // забыли case — ошибка компиляции
};

Enum может иметь поля, конструктор и методы:

enum Planet {
    MERCURY(3.303e+23, 2.4397e6),
    VENUS  (4.869e+24, 6.0518e6),
    EARTH  (5.976e+24, 6.37814e6);

    private final double mass;
    private final double radius;

    Planet(double mass, double radius) {
        this.mass   = mass;
        this.radius = radius;
    }

    double surfaceGravity() {
        final double G = 6.67300E-11;
        return G * mass / (radius * radius);
    }
}

Planet.EARTH.surfaceGravity(); // 9.8...
Копнуть глубже

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

enum DatabaseConnection {
    INSTANCE;

    private final Connection conn = createConnection();

    public Connection get() { return conn; }
}

DatabaseConnection.INSTANCE.get(); // всегда один объект

EnumSet и EnumMap — специализированные коллекции для enum, намного быстрее обычных (EnumSet реализован на long битмаске):

EnumSet<Status> activeStatuses = EnumSet.of(Status.ACTIVE, Status.SUSPENDED);
EnumMap<Status, String> labels = new EnumMap<>(Status.class);
labels.put(Status.ACTIVE, "Активен");

valueOf и values:

Status s = Status.valueOf("ACTIVE");  // строка → enum, бросит если неизвестно
Status[] all = Status.values();       // все значения в порядке объявления

Enum реализует интерфейс — для полиморфного поведения по значению:

enum Operation {
    PLUS  { public int apply(int x, int y) { return x + y; } },
    MINUS { public int apply(int x, int y) { return x - y; } };

    public abstract int apply(int x, int y);
}
🎤 Закрыл тему, если можешь объяснить:
• зачем enum вместо констант int и что компилятор проверяет;
• почему enum — лучший Singleton и что такое EnumSet (если дошёл до 2-го слоя).