Перечисление в Java. Преимущества? - PullRequest
19 голосов
/ 16 января 2010

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

Ответы [ 10 ]

26 голосов
/ 16 января 2010

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

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

не обеспечивает

void selectOption(int option) {
...
}

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

11 голосов
/ 16 января 2010

Тип безопасности является одной из причин.

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

AddItem(HttpMethod.POST, ProductEntry.class),
7 голосов
/ 17 января 2010

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

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

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

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

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

Итак, перечисления Java 5 имеют следующие преимущества перед целыми:

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

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

  • Меньше подверженных ошибкам шаблонов (частный конструктор, readResolve() и т. Д.);
  • Семантическая корректность. Вы видите, что что-то является перечислением, и вы знаете, что оно просто представляет значение. Вы видите класс, и вы не уверены. Может быть, где-то есть метод статической фабрики и т. Д. Перечисления Java 5 гораздо более четко указывают на намерение.
4 голосов
/ 16 января 2010

Перечисления уже являются классом в Java .

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

3 голосов
/ 16 января 2010

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

2 голосов
/ 17 января 2010

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

public enum Elvis {
    INSTANCE
}
1 голос
/ 16 января 2010

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

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

EnumMap сочетает в себе богатство и безопасность типов Map со скоростью массива ( Effective Java ).

0 голосов
/ 30 марта 2016

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

OCA Java SE 7 Programmer I Учебное пособие

0 голосов
/ 17 января 2010

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

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

0 голосов
/ 16 января 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...