Да, вы создали отдельные экземпляры для каждого значения в перечислении:
public abstract class RoundingMode {
public static final RoundingMode HALF_UP = new RoundingMode();
public static final RoundingMode HALF_EVEN = new RoundingMode();
private RoundingMode() {
// private scope prevents any subtypes outside of this class
}
}
Однако , конструкция enum
дает вам различные преимущества:
- toString () каждого экземпляра печатает имя, указанное в коде.
- (Как упоминалось в другом посте) переменную типа enum можно сравнить с константами, используя управляющую структуру
switch-case
.
- Все значения в перечислении можно запросить, используя поле
values
, которое «генерируется» для каждого типа перечисления
- Вот большое сравнение с идентичностью: значения перечисления переживают сериализацию без клонирования.
Сериализация - это большая ошибка. Если бы я использовал приведенный выше код вместо перечисления, вот как будет вести себя равенство идентичностей:
RoundingMode original = RoundingMode.HALF_UP;
assert (RoundingMode.HALF_UP == original); // passes
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(original);
oos.flush();
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
RoundingMode deserialized = (RoundingMode) ois.readObject();
assert (RoundingMode.HALF_UP == deserialized); // fails
assert (RoundingMode.HALF_EVEN == deserialized); // fails
Вы можете решить эту проблему без enum, используя технику, которая включает writeReplace
и readResolve
, (см. http://java.sun.com/j2se/1.4.2/docs/api/java/io/Serializable.html)...
Полагаю, суть в том, что Java старается изо всех сил разрешать вам использовать тождества перечислимых значений для проверки равенства; это рекомендуемая практика.