Что такое enum (перечисление) в Java и для чего оно используется?

Ответ

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 — это мощно, стильно и правильно. Как только у тебя в коде появляется список из трёх-четырёх констант, которые связаны между собой — сразу думай про перечисление. Замена "магическим" строкам и числам, которые только и ждут, чтобы всё сломать.