Да, это как если бы вы создали экземпляры singleton для каждого значения в перечислении:
общедоступный абстрактный класс RoundingMode {
общедоступный статический финальный RoundingMode HALF_UP = new RoundingMode ();
общедоступный статический финальный RoundingMode HALF_EVEN = new RoundingMode ();
private RoundingMode () {
// частная область предотвращает любые подтипы вне этого класса
}
}
Тем не менее , то enum
конструкция дает различные преимущества:
- ToString () каждого экземпляра печатает имя, указанное в коде.
- (Как упоминалось в другом сообщении) переменную типа enum можно сравнить с константами с помощью
switch-case
структуры управления.
- Все значения в перечислении могут быть запрошены с использованием
values
поля, которое «сгенерировано» для каждого типа перечисления.
- Вот главный вопрос сравнений идентичности: значения перечисления выдерживают сериализацию без клонирования.
Сериализация - большая проблема. Если бы я использовал приведенный выше код вместо перечисления, вот как ведет себя равенство идентичности:
RoundingMode original = RoundingMode.HALF_UP;
assert (RoundingMode.HALF_UP == оригинал); // проходит
ByteArrayOutputStream baos = новый ByteArrayOutputStream ();
ObjectOutputStream oos = новый ObjectOutputStream (baos);
oos.writeObject (оригинал);
oos.flush ();
ByteArrayInputStream bais = новый ByteArrayInputStream (baos.toByteArray ());
ObjectInputStream ois = новый ObjectInputStream (bais);
RoundingMode deserialized = (RoundingMode) ois.readObject ();
assert (RoundingMode.HALF_UP == десериализовано); // не удается
assert (RoundingMode.HALF_EVEN == десериализовано); // не удается
Вы можете решить эту проблему без перечисления, используя технику, которая включает writeReplace
и readResolve
(см. Http://java.sun.com/j2se/1.4.2/docs/api/java/io/Serializable.html ) ...
Думаю, дело в том, что Java делает все возможное, чтобы позволить вам использовать идентификаторы значений перечисления для проверки равенства; это рекомендуемая практика.