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-го слоя).
• почему enum — лучший Singleton и что такое EnumSet (если дошёл до 2-го слоя).