Перечисление в Java. Преимущества?

Что некоторыми преимуществами создания является перечисление в Java, подобном классу, а не просто набору констант как в C/C++?

19
задан Tom Hawtin - tackline 16 January 2010 в 15:12
поделиться

9 ответов

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

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

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

void selectOption(int option) {
...
}

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

27
ответ дан 30 November 2019 в 02:24
поделиться

enum - это класс в Java .

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

4
ответ дан 30 November 2019 в 02:24
поделиться

Безопасность типа - одна из причин.

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

AddItem(HttpMethod.POST, ProductEntry.class),
11
ответ дан 30 November 2019 в 02:24
поделиться

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

3
ответ дан 30 November 2019 в 02:24
поделиться

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

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

0
ответ дан 30 November 2019 в 02:24
поделиться

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

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

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

1
ответ дан 30 November 2019 в 02:24
поделиться

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

public enum Elvis {
    INSTANCE
}
2
ответ дан 30 November 2019 в 02:24
поделиться

Я поясню свой комментарий в этом ответе.

  1. Я утверждаю, что нет причин предполагать, что вы хотите найти исключения и завершить некоторые ресурсы на том же уровне . Возможно, вы привыкли делать это так на языке, на котором было удобно обращаться с обоими одновременно, но это совпадение, когда это происходит. Финализация удобна, когда не удается перехватить все исключения из внутреннего блока. try... with предназначен для обнаружения исключений, так что вычисление может быть продолжено нормально. Между ними просто нет отношений (если что, они идут в противоположных направлениях: вы ловите исключение, или пропускаете его?).

  2. Почему вы вообще должны что-либо дорабатывать? Разве GC не должен управлять неиспользуемыми ресурсами для вас? Ах... но язык пытается предоставить вам доступ к системным примитивам, которые работают с побочными эффектами, с явными выделениями и отменами выделения. Вы должны отменить присвоение того, что вы присвоили (во всех случаях)... Не следует ли обвинять в гнилом интерфейсе, который система предоставляет вместо F #, который в данном случае является только мессенджером?

-121--3250528-

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

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

-121--2180543-

Java 5 enums произошло от typesafe enum pattern от Джошуа Блоха Эффективная Java (первое издание), чтобы избежать подводных камней enums в C/C +

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

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

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

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

Таким образом, Java 5 enums предлагают следующие преимущества по сравнению с ints:

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

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

  • шаблон с меньшей склонностью к ошибкам (частный конструктор, readResolve () и т.д.);
  • семантическая корректность. Вы видите, что что-то является перечислением, и вы знаете, что это просто представляет ценность. Ты видишь класс и не уверен. Может, где-то есть статический заводской метод и т.д. Перечисления Java 5 гораздо более четко указывают на намерение.
7
ответ дан 30 November 2019 в 02:24
поделиться

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

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

0
ответ дан 30 November 2019 в 02:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: