java enum в классе

Кроме отдельных примитивных типов данных и классов в Java есть такой тип как enum или перечисление. Перечисления представляют набор логически связанных констант. Объявление перечисления происходит с помощью оператора enum, после которого идет название перечисления. Затем идет список элементов перечисления через запятую:

Перечисление фактически представляет новый тип, поэтому мы можем определить переменную данного типа и использовать ее:

Перечисления могут использоваться в классах для хранения данных:

Само перечисление объявлено вне класса, оно содержит четыре жанра книг. Класс Book кроме обычных переменных содержит также переменную типа нашего перечисления. В конструкторе мы ее также можем присвоить, как и обычные поля класса.

С помощью конструкции switch..case можно проверить принадлежность значения bookType определенной константе перечисления.

Методы перечислений

Каждое перечисление имеет статический метод values() . Он возвращает массив всех констант перечисления:

Метод ordinal() возвращает порядковый номер определенной константы (нумерация начинается с 0):

Конструкторы, поля и методы перечисления

Перечисления, как и обычные классы, могут определять конструкторы, поля и методы. Например:

Перечисление Color определяет приватное поле code для хранения кода цвета, а с помощью метода getCode оно возвращается. Через конструктор передается для него значение. Следует отметить, что конструктор по умолчанию приватный, то есть имеет модификатор private. Любой другой модификатор будет считаться ошибкой. Поэтому создать константы перечисления с помощью конструктора мы можем только внутри перечисления.

Также можно определять методы для отдельных констант:

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

Перечисления создаются с использованием ключевого слова enum. Создадим перечисление семейства кошачьих:

Идентификаторы в фигурных скобках называются константами перечисления. Каждый из них явно объявлен как открытый статический финальный член класса Cat. Объявив перечисление, вы можете создавать переменные этого типа. Но делать это нужно без оператора new, а в упрощенном виде. Объявим переменную manul перечислимого типа Cat.

Вы можете присвоить переменной только те значения, которые определены в перечислении, например:

Обратите внимание, что во время присваивания вы указываете и тип Cat.

Использование перечисляемых переменных позволят избежать ошибок. Например, мы хотим использовать только числа 1, 2, 3 и такой способ не позволит использовать числа 0, 5, 9 и т.д.

Перечислимые константы можно проверить на равенство:

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

Метод values()

Автоматически предопределённый метод для перечисления values() возвращает массив, содержащий список констант перечисления.

Для примера использовалась дополнительная переменная allcats, которой присваивается ссылка на массив перечислимых значений. Можно обойтись без дополнительной переменной.

Метод valueOf(String string)

Автоматически предопределённый метод для перечисления valueOf() возвращает константу перечисления, значение которой соответствует строке, переданной в параметре.

Так как перечисление в Java — это тип класса, то вы можете использовать конструкторы, добавлять переменных экземпляров, методы и интерфейсы. Следует сказать, что в Android сначала не рекомендовалось использовать перечисления из-за большого потребления памяти. Сейчас вроде это ограничение сняли, но тем не менее пока перечисления не так широко используются в приложениях для мобильных устройств, поэтому подробно разбирать все возможности перечисления не будем.

Метод ordinal()

У перечислений есть несколько удобных методов. Например, вы можете получить значение, которое указывает позицию константы в списке констант перечисления (порядковое значение или ordinal value), с помощью метода ordinal(). Порядковые значения начинаются с нуля.

Методы compareTo() и equals()

Также можно сравнивать порядковые значения констант одного и того же перечисления с помощью метода compareTo(). Или сравнить на эквивалентность через метод equals().

Увлекаться не стоит из-за большого потребления памяти. Сравним.

По этой причине на сегодняшний день в Android рекомендуется избегать enum. Хотя в последнее время я встречал использование перечислений в исходных кодах Android.

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

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

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

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

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

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

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

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

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

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

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

Оцените статью