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 Программист я Учебное пособие