Enum в Java. Преимущества?

Какие преимущества делают enum в Java похожим на класс, а не просто набор констант, как в C/С++?

Ответ 1

Вы получаете бесплатную проверку правильности значений времени компиляции. Использование

public static int OPTION_ONE = 0;
public static int OPTION_TWO = 1;

не гарантирует

void selectOption(int option) {
...
}

будет принимать только 0 или 1 в качестве значения параметра. Используя перечисление, это гарантировано. Более того, это приводит к более самодокументирующему коду, потому что вы можете использовать завершение кода для просмотра всех значений перечисления.

Ответ 2

Тип безопасности - одна из причин.

Другой, который я нахожу более важным, заключается в том, что вы можете прикреплять метаданные к значениям перечисления в Java. Например, вы можете использовать перечисление для определения набора юридических операций для веб-службы, а затем присоединить метаданные для типа запроса и класса данных:

AddItem(HttpMethod.POST, ProductEntry.class),

Ответ 3

Java 5 перечислений происходит из шаблона перечисления типов из Джошуа Блох Эффективный Java (первое издание), чтобы избежать ловушек перечислений в C/С++/С# (которые представляют собой просто тонкие скрытые int-константы) и использование в Java конечных статических int-констант.

В основном int константы и int перечисления не являются типичными. Вы можете передать любое значение int. В C/С++ вы можете сделать это:

enum A { one, two, three };
enum B { beef, chicken, pork } b = beef;

void func(A a) { ... }
func((A)b);

К сожалению, типичная диаграмма enum из Effective Java имеет много шаблонов, но не все это очевидно. Наиболее примечательным является то, что вам пришлось переопределить частный метод readResolve, чтобы остановить создание Java-экземпляров новых экземпляров при десериализации, что приведет к нарушению простой проверки ссылок (т.е. С помощью оператора == вместо equals()).

Итак, перечисления Java 5 предлагают эти преимущества по сравнению с ints:

  • Тип безопасности;
  • Перечисления Java 5 могут иметь поведение и реализовывать интерфейсы;
  • Java 5 перечислений имеют некоторые чрезвычайно легкие структуры данных, такие как EnumSet и EnumMap.

Java 5 перечисляет эти преимущества перед использованием только классов:

  • Меньше ошибочного шаблона (частный конструктор, readResolve() и т.д.);
  • Семантическая корректность. Вы видите, что что-то представляет собой перечисление, и вы знаете, что оно просто представляет ценность. Вы видите класс, и вы не уверены. Может быть, есть статический метод factory где-то и т.д. Java 5 перечисляет гораздо более четкое указание на намерение.

Ответ 4

Enums уже представляют класс в Java.

Если вы спрашиваете, почему это лучше, я бы сказал, что лучше вспомнить безопасность более высокого типа и способность добавлять другие атрибуты, кроме простого порядкового значения.

Ответ 5

В дополнение к лучшей безопасности типов вы также можете определить индивидуальное поведение в своих перечислениях (см. Эффективная Java для некоторых хороших примеров).

Ответ 6

Вы можете использовать перечисления для эффективного внедрения Singletons ^^:

public enum Elvis {
    INSTANCE
}

Ответ 7

Создание перечисления ссылочного типа, которое может содержать фиксированный набор констант, привело к эффективной реализации Map, например, EnumMap и Установить реализацию, например EnumSet (классы JDK).

Из javadoc из EnumMap:
<Я > Специальная реализация карты для использования с ключами типа enum. Все ключи в карте перечисления должны исходить из одного типа перечисления, который указан, явно или неявно, при создании карты. Карты Enum представлены внутри как массивы. Это представление чрезвычайно компактно и эффективно.

EnumMap сочетает в себе богатство и безопасность типов карты со скоростью массива (Эффективная Java).

Ответ 8

Перечисления являются самим типом - вы не можете использовать перечисление, которое не существует, или помещать в какую-либо другую аналогичную перспективу. а также вы можете перечислить их, чтобы код был более кратким.

используя статические константы, потенциально может вызвать кошмары, связанные с поддержанием, особенно если они распределены по площади.

Ответ 9

Единственное реальное преимущество заключается в том, что его можно использовать в switch. Все остальные вещи, которые можно перечислить, можно просто сделать с обычным ванильным классом с конструктором private, экземпляры которого, в свою очередь, объявлены как поля public static final рассматриваемого класса (шаблон типа). Другое преимущество перечисления, очевидно, делает код менее подробным, чем вы делаете с простым классом ванили.

Но если я не ошибаюсь, в С++ (или это был С#?), вы можете использовать String в инструкции switch. Таким образом, преимущество перечислений в Java незначительно, в отличие от С++. Однако то же самое было предложено для Java 7, но не уверен, что он это сделает.

Ответ 10

Преимущества использования перечислений: Объект может быть создан для работы таким же образом, как и перечисление. По факту, перечисления даже не были включены в язык Java до версии 5.0. Однако, перечисления делают код более читаемым и предоставляют меньше места для ошибки программиста.

OCA Java SE 7 Программист я Учебное пособие