Так, це так, ніби ви створили одиночні екземпляри для кожного значення в enum:
публічний абстрактний клас RoundingMode {
державний статичний підсумковий RoundingMode HALF_UP = новий RoundingMode ();
загальнодоступний статичний кінцевий RoundingMode HALF_EVEN = новий RoundingMode ();
приватний RoundingMode () {
// приватна сфера запобігає будь-яким підтипам поза цим класом
}
}
Тим НЕ менше , то enum
конструкція дає різні переваги:
- Кожен екземпляр toString () друкує ім'я, вказане в коді.
- (Як уже згадувалося в іншому дописі) змінну типу перерахунку можна порівняти з константами за допомогою
switch-case
керуючої структури.
- Усі значення перерахунку можна запитувати, використовуючи
values
поле, яке "генерується" для кожного типу перерахування
- Ось велике порівняння ідентичності wrt: значення enum переживають серіалізацію без клонування.
Серіалізація - велика готчя. Якби я використовував вищезазначений код замість enum, ось як поводиться рівність ідентичності:
RoundingMode оригінал = RoundingMode.HALF_UP;
assert (RoundingMode.HALF_UP == оригінал); // проходить
ByteArrayOutputStream baos = новий ByteArrayOutputStream ();
ObjectOutputStream oos = новий ObjectOutputStream (баос);
oos.writeObject (оригінал);
oos.flush ();
ByteArrayInputStream bais = новий ByteArrayInputStream (baos.toByteArray ());
ObjectInputStream ois = новий ObjectInputStream (bais);
RoundingMode десеріалізований = (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 виходить із шляху, щоб дозволити використовувати тотожність значень enum для перевірки рівності; це заохочена практика.