Перечисления в Java. Преимущества использования Enum

Перечисления в Java. Преимущества использования Enum

Enum был введен в Java 1.5 в качестве нового типа, поля которого являются константами.

В этом уроке мы узнаем как создать перечисление (Enum), каковы преимущества и особенности использования перечислений. Мы также на примере увидим использование Enum valueOf, значения Enum, EnumSet и EnumMap.

Enum — ключевое слово для создания типа перечисления; очень похоже на класс. Давайте посмотрим пример простого перечисления.

Простой пример использования Enum

ThreadStatesEnum.java

В примере выше класс ThreadStatesEnum является Enum с фиксированным набором констант START, RUNNING, WAITING и DEAD.

Теперь давайте посмотрим, почему перечисление (Enum) лучше, чем обычные константы полей в классах Java.

Для примера создаем такой же класс с такими же константами

ThreadStatesConstantClass.java

И сразу же посмотрим перечисления и класс с константами в бою:

Если мы посмотрим на пример выше, то сразу увидим две проблемы использования констант, которые решаются с помощью Enam:

  1. Мы можем передать любой int в параметр метода simpleConstantsExample(int i). Эта проблема решается только фиксированным значением simpleEnumExample(ThreadStates th), что обеспечивает безопасность.
  2. Мы можем изменить значение константы int в ThreadStatesConstantClass классе, но программа не будет бросать никаких исключений, хотя может работать не так, как ожидалось. Но если мы изменим саму константу Enum, то получим исключение.

Результатом выполнения программы будет следующее:

Продвинутые возможности Enum (перечислений)

А теперь давайте рассмотрим продвинутые возможности перечислений (Enum) на тестовом классе:

ThreadStatesEnum.java

Правила использования Enum

  1. Все перечисления в Java неявно расширяют java.lang.Enum класс, который расширяет класс Object и реализует Serializable и Comparable интерфейсы, так что Enum не может наследовать классы.
  2. Нельзя заканчивать имя пакета словом enum, например, com.javadevblog.enum —  недопустимое имя пакета.
  3. Перечисления в Java могут реализовывать интерфейсы. (На примере выше есть Enum, который реализовывает интерфейс Closeable.
  4. Enum конструкторы в Java всегда private.
  5. Нельзя создать экземпляр перечисления, используя оператор new.
  6. Мы можем создавать абстрактные методы в Enum, поэтому все поля Enum должны реализовывать абстрактный метод. (В приведенном выше примере метод getDetail() является абстрактным и все поля в Enum реализовали его.
  7. Мы можем определить метод в Enum, а поля могут переопределять их.
  8. Все поля в Enum имеют пространство имен, поэтому мы можем использовать поле только с именем класса: ThreadStates.START
  9. Перечисления могут быть использованы в switch. Пример использования увидим чуть позже в этом уроке.
  10. Мы можем изменять существующее перечисление не нарушая существующей функциональности. Например, мы можем добавить новое поле NEW в ThreadStatesClass и это никак не повлияет на существующую функциональность.
  11. Хорошим тоном считается написание большими буквами и нижнее подчеркивание для пробелом. Например, EAST, WEST, EAST_DIRECTION и т.д.
  12. Enum константы неявно static и final
  13. Enum константы являются final, но ее можно изменять. Например, мы можем использовать метод setPriority(), чтобы изменить приоритет констант в Enum. (Мы увидим его на практике в примере ниже).
  14. Мы может безопасно сравнивать константы с помощью «==» и метода equals(). Они оба будут давать тот же результат.

Продвинутые возможности Enum на примере

Мы уже знаем правила использование Enum, его расширенные возможности, а также подводные камни. Самое время испытать это все на примере:

JavaEnumExamples.java

Результат выполнения программы:

А теперь подробно по каждой функции

  1. Метод usingEnumMethods() показывает как создать объект перечисления и как мы можем использовать его методы.
  2. Метод usingEnumValueOf() показывает использование метода valueOf(enumType, name) класса java.util.Enum, с помощью которого мы можем создать объект перечисления из строки.
  3. Метод usingEnumValues() показывает использование метода values(), который возвращает массив, содержащий все значения перечисления в том порядке, в котором они были объявлены. Обратите внимание, что этот метод автоматически генерируется компилятором Java для каждого перечисления. Вы не найдете реализацию метода values() в классе java.util.Enum.
  4. Метод usingEnumInSwitch() показывает, как использовать константы Enum в switch.
  5. Метод usingEnumMap() показывает использование java.util.EnumMap, который ввелся в Java 1.5 Collections Framework. EnumMap является реализацией Map. Все ключи в EnumMap должны быть одного типа, указанного явно или неявно, когда карта будет создана. Мы не можем использовать null в качестве ключа для EnumMap.

Вот и все, что нужно знать о Enum в Java для комфортной и эффективной работы.

Делитесь материалом и следите за обновлениями на javadevblog.com

4 thoughts to “Перечисления в Java. Преимущества использования Enum”

  1. Подскажите, здесь нет ошибки?
    ThreadStatesEnum.java
    //Enum конструкторы должны всегда быть private.
    private ThreadStatesEnumClass(int i){
    priority = i;
    }

    Я думаю должно быть без «class»
    private ThreadStatesEnum(int i){
    priority = i;
    }

  2. Читал, что Enum значительно тяжелее, чем «магические» константы. Примерно в пять раз.
    Насколько целесообразно использовать их?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *