Перечисления Enum в Java - Часть 3

FacebooktwittertumblrFacebooktwittertumblr

Данная статья:

  • написана командой Vertex Academy. Надеемся, что она Вам будет полезна. Приятного прочтения!
  • это одна из статей из нашего "Самоучителя по Java" 
  • Данная статья предполагает, что Вы уже хорошо знаете ООП.

В предыдущей статье (Перечисления Enum в Java - Часть 2) мы познакомились с Enum немного ближе и узнали, что у них есть уже готовые к использованию методы. Но что, если нам недостаточно тех методов, которые предоставляет enum? Об этом Вы узнаете в этой статье.

Мы рассмотрим на конкретных примерах следующее:

1. Конструкторы и переменные

2. Методы в перечислениях

3. Специальные коллекции для перечислений


Как и в предыдущей статье, нам понадобится enum

Поехали.

1. Конструкторы и переменные в enum

У каждой страны есть своя валюта, чтобы её задать необходимо создать конструктор в enum Country и добавить поле currency

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

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

Обратите внимание на значения LAOPAPAS и ZIMKABU(). Использовать конструктор по умолчанию - можно и так и так.

Пример использования enum Currency

Вывод в консоль:

Поля и методы в перечислениях как и в классах могут иметь модификаторы доступа private, protected, default, public, а вот конструкторы в перечислениях всегда будут иметь модификатор  private. При попытке указать другой модификатор мы получим ошибку компиляции.

2. Методы в перечислениях

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

Общие методы в перечислениях

Добавим в перечисление метод hasCurrency(), который будет возвращать true или false в зависимости от того, есть валюта у страны или нет

И рассмотрим использование

Вывод в консоль

Абстрактные методы в перечислениях

С абстрактными методами немного сложнее, добавим абстрактный метод void sayHello()

Теперь нам нужно реализовать этот метод во всех значениях перечисления

И посмотрим на использование этого метода.

Вывод в консоль

Если же мы оставим одно значение не переопределённым то получим ошибку компиляции

3. Специальные коллекции для перечислений

Никто нам не запрещает использовать такие коллекции как ArrayList или HashSet вместе с перечислениями, это будет работать точно так же как и с другими значениями. Но раз уж мы знаем наперед значения перечислений, знаем их количество и знаем, что новые значения не будут добавляться в перечисление в работе приложения(в Runtime) т.к. это невозможно,  то разработчики придумали специальную коллекцию для них. Эта коллекция работает быстрее и эффективнее обычных, используя, особенности перечислений, которые мы только что описали выше. Эта коллекция называется EnumSet. При работе с enum хорошей практикой является использовать именно коллекцию  EnumSet вместо стандартных коллекций.

Примеры создания EnumSet.

Пример 1 

Метод allOf() создает EnumSet из всех значений заданого перечисления.

Пример 2

Метод of() создает EnumSet, который содержит заданные значения. Метод перегружен, принимая от одного значения до 5 и еще раз перегружен методом of(E first, E... rest), который принимает сколько угодно значений. Всё это нужно для оптимизации и быстродействия EnumSet.

Пример 3

Метод range() создает EnumSet, который содержит все значения перечисления между указанными значениями.

Пример 4

Метод copyOf() возвращает копию указанного EnumSet, либо же копию любой другой коллекции этого перечисления.

Пример 5

Изначально, в EnumSet у нас были три страны CANADA, POLAND и GERMANY. Ззатем метод complementOf() создал нам EnumSet который содержит значения LAOPAPAS, ZIMKABU, то есть все значения, которые НЕ содержатся в изначальной коллекции.

Пример 6

Метод noneOf() возвращает пустой EnumSet заданного типа.

P.S.

На самом деле EnumSet это абстрактный класс у которого 2 реализации - RegularEnumSet и JumboEnumSet. Выбор реализации определяется в методах создания EnumSet. Если количество элементов в перечислении, из которого вы хотите создать EnumSet, не превышает 64 то выбран будет RegularEnumSet, если элементов больше 64 - будет выбран JumboEnumSet.

Почему именно 64 элемента? Потому что в RegularEnumSet все значения перечисления умещаются в одну переменную типа long, максимальное колличество битов в котором равно 64. Все операции в RegularEnumSet  основаны на булевой логике.

В JumboEnumSet также используется булевая логика, но вместе с массивом значений.

На этом урок заканчивается

За это время мы изучили:

  • основы работы с перечислениями
  • что такое на самом деле enum
  • как добавлять конструкторы, поля и методы в enum
  • специальные коллекции для перечислений

Спасибо, что были с нами! 🙂


Надеемся, что наша статья была Вам полезна.  Можно записаться к нам на курсы по Java на сайте.

FacebooktwittertumblrFacebooktwittertumblr

FacebooktwittertumblrFacebooktwittertumblr
Самоучители--узнать детальнее--