java enum со значениями

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

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

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

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

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

Содержание

  1. Методы перечислений
  2. Конструкторы, поля и методы перечисления
  3. 4 ответа 4

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

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

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

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

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

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

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

Информация в посте приведена на основе книги Эккель Б. Философия Java (4-е издание)

Ключевое слово enum создает новый тип с ограниченным набором именованных значений, и работать с этими значениями можно как с обычными компонентами программы.

Мы можем получить список констант перечисления, вызвав для enum метод values() . Метод values() создает массив констант перечисления, следующих в порядке их объявления, так что полученный массив может использоваться в цикле foreach.

При создании перечисления компилятор генерирует соответствующий класс. Этот класс автоматически наследует от класса java.lang.Enum . Элементы enum это статически доступные экземпляры enum-класса. Некоторые полезные возможности базового класса продемонстрированы в следующем примере:

Метод ordinal() возвращает значение int, определяющее порядок объявления экземпляров перечисления начиная с нуля. Экземпляры всегда можно безопасно сравнивать с оператором ==, a методы equals() и hashCode() автоматически создаются за вас. Класс Enum реализует интерфейс Comparable , поэтому в нем присутствует метод compareTo( ) , кроме того, реализуется интерфейс Serializable .

Метод name() возвращает имя точно в таком виде, в каком оно было объявлено; эту же информацию возвращает метод toString() . Статический метод valueOf() возвращает экземпляр перечисления, соответствующий переданному строковому имени, или возбуждает исключение при отсутствии подходящего экземпляра.

Пример получения элемент enum по его строковому представлению

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

Допустим, вы решили определить для перечисления другое описание — вместо реализации toString() по умолчанию, которая просто выдает имя экземпляра перечисления. Для этого можно предоставить конструктор для сохранения расширенной информации, a также дополнительные методы для передачи расширенного описания:

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

Конструктор и методы строятся пo той же схеме, что и в обычном классе‚ потому что перечисление (с некоторыми ограничениями) и является обычным классом.

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

Меня всегда волновал вопрос класса Enum : какие у них есть преимущества перед обычными static final примитивами?

И, если можно, поделитесь вашим опытом, в котором использование Enum было бы действительно оправданным.

4 ответа 4

enum имеет ряд преимуществ при использовании в сравнении с static final int . И использовать его стоит в том случае если вам нужны эти преимущества.

Главным отличием является то что используя enum вы можете проверить тип данных.

При этом вы можете передать в класс любое значение int .

Следовательно, основные проблемы использования static final int это:

  • Необходимость проверки вводимых данных.
  • Нет никакой защиты от создания static final int переменной с дублирующимся значением.

Еще одним преимуществом enum является возможность перегружать методы.

Недостатки использования enum

  • К ним не применимы операторы >, =, enum не стоит применять в списке последовательных данных.
  • enum также требует больше памяти для хранения чем обычная константа.

IntDef и StringDef в Android

Google не рекомендует использовать enum в Android приложениях из-за того что это требует больше памяти. Вместо этого для Android можно использовать IntDef и StringDef которые позволяют ограничивать пространство значений для обычных констант. Следовательно, вы получаете главное преимущество enum не теряя в использовании памяти. Это практика повсеместно используется в стандартных классах Android:

В принимающем методе используется специальная аннотация:

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

Источник: computermaker.info

Техника и Гаджеты
Добавить комментарий