В Java enum — это класс-тип, наследник java.lang.Enum, представляющий собой комплект ограниченных объектов-констант, но не ограничивается лишь набором имён: enum можно расширять методами, полями, конструктором, реализовывать интерфейсы и добавлять поведение.
Пример:
enum Day { MONDAY("Будний день"), SATURDAY("Выходной"); private String description; Day(String description) { this.description = description; } public String getDescription() { return description; } } Day d = Day.SATURDAY; System.out.println(d.getDescription()); // "Выходной"
Тонкости:
Вопрос: "Можно ли в enum'е переопределить методы для некоторых значений enum? Если да — как?"
Часто ошибаются: ошибочно полагают, что у всех значений поведение всегда одинаковое.
Верный ответ: Да, возможны специфические реализации для отдельных констант.
Пример:
enum Operation { PLUS { double apply(double x, double y) { return x + y; } }, MINUS { double apply(double x, double y) { return x - y; } }; abstract double apply(double x, double y); }
История
В системе учёта автомобилистов хранили статусы enum'ами, не реализовали дополнительное поле для кода API — разработчики пытались расширить enum через наследование, а это запрещено. В итоге пришлось переделывать модель хранения статусов.
История
В интернет-магазине программисты "распаковали" enum с приватным конструктором reflection-утилитой, чтобы создать поддельный экземпляр для тестов, но получили Exception: enum защищён от создания новых экземпляров. CI не прошёл, тесты упали.
История
На одном старом проекте значения enum'а сравнивали по equals(), а не через ==. Неожиданно при десериализации возникали проблемы: значения enum всегда сравнивают через ==, потому что это синглтоны.