Ответ
enum (перечисление) в Java — это специальный тип данных, представляющий собой фиксированный набор именованных констант. Это полноценный класс, наследующийся от java.lang.Enum.
Ключевые особенности и преимущества:
- Типобезопасность: Замена "магических" чисел или строк (например,
1,"MONDAY") наDayOfWeek.MONDAY. - Читаемость и самодокументируемость кода.
- Может иметь поля, методы и конструкторы. Конструктор всегда
private(или package-private). - Реализует шаблон Singleton для своих элементов, обеспечивая потокобезопасное создание.
- Поддержка в
switch. - Методы:
values(),valueOf(String name),ordinal()(использовать с осторожностью).
Расширенный пример:
public enum Planet {
// Элементы enum — это вызовы конструктора.
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;
}
// Метод экземпляра
public double surfaceGravity() {
return 6.67300E-11 * mass / (radius * radius);
}
}
// Использование
Planet earth = Planet.EARTH;
double gravity = earth.surfaceGravity();
Используйте enum для представления любых ограниченных, известных на этапе компиляции вариантов: состояния, коды ошибок, флаги, конфигурации.
Ответ 18+ 🔞
А, ну ты смотри, про enum в Java спрашиваешь. Ну это ж, блядь, не просто циферки в коде, это целая философия, ёпта! Представь, что у тебя есть список чего-то, что не должно меняться никогда, в рот меня чих-пых. Дни недели, планеты, состояния заказа — вот эта вся хуйня.
Раньше-то, мудаки, писали так: int MONDAY = 1;. А потом в коде if (day == 1) {...}. И через полгода нихуя не понятно, что эта единица значит. А теперь — DayOfWeek.MONDAY. Красота, блядь! Типобезопасно, читаемо, и компилятор тебя за руку ловит, если ты какую-то дичь подсовываешь.
Так вот, этот enum — он на самом деле не дурак, он полноценный класс, только наследник у него особенный, java.lang.Enum. И у него есть свои приколы:
- Элементы — это синглтоны. Создаются один раз, потокобезопасно, на всю жизнь. Не надо там
newгородить. - Может иметь всё, как класс. Поля, методы, конструктор — пожалуйста! Только конструктор у него всегда
private, потому что кто ты такой, чтобы новые планеты создавать? Их создал бог, то есть разработчик, на этапе компиляции, и всё. - Методы полезные есть.
values()— все элементы перечисления в массив.valueOf("EARTH")— из строки получишь константу.ordinal()— её порядковый номер, но на него завязываться — это пиздец как не рекомендуется, потому что если порядок поменяется, всё ебет.
Смотри, какой овердохуища пример можно сделать:
public 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; // метры
// Конструктор. Сам попробуй сделать его public — получишь по ебалу от компилятора.
Planet(double mass, double radius) {
this.mass = mass;
this.radius = radius;
}
// И метод можно прикрутить, да не один!
public double surfaceGravity() {
return 6.67300E-11 * mass / (radius * radius);
}
}
// Использовать — одно удовольствие, блядь.
Planet earth = Planet.EARTH;
double gravity = earth.surfaceGravity(); // И сиди, считай, на какой планете сколько весишь.
Короче, enum — это мощно, стильно и правильно. Как только у тебя в коде появляется список из трёх-четырёх констант, которые связаны между собой — сразу думай про перечисление. Замена "магическим" строкам и числам, которые только и ждут, чтобы всё сломать.