Java 8 перечисления

Цикл статей «Учебник Java 8».

Следующая статья — «Java 8 числа».
Предыдущая статья — «Java 8 наследование».

Тип enum  — это специальный тип, который позволяет переменной иметь одно из предопределённых константных значений. Объявление перечислений схоже с объявлениями классов: модификатор доступа, ключевое слово enum  (НЕ class !), имя типа, тело перечисления. Тело перечисления содержит имена предопределённых константных значений.

Пример:

Затем можно объявить переменную нашего созданного типа перечисления:

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

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

Файл «Goblin.java»:

Перечисления в Java являются классами.

Все перечисления неявно наследуются от класса java.lang.Enum. Поскольку в Java нет множественного наследования, то перечисление не может наследоваться от какого-либо другого класса дополнительно, но может реализовывать сколько угодно интерфейсов.

Из класса java.lang.Enum  каждое перечисление получает пару полезных методов:

Возвращает порядковый номер константы в перечислении. Нумерация начинается с нуля.

Метод name()  возвращает имя константы так, как оно было объявлено в перечислении. Например, NORTH .

Также все перечисления неявно становятся final, если у них нет ни одной константы с телом класса (описано ниже). Нельзя указывать перечисление в качестве расширяемого класса. Нельзя указывать модификаторы final  и abstract  для перечислений.

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

Так как вложенные перечисления являются статическими, то отсюда вытекает, что анонимные классы; лямбда выражения; внутренние классы, являющиеся нестатическими членами класса, и локальные классы НЕ могут содержать перечислений.

К каждому перечислению компилятор добавляет статический метод values() , который возвращает массив возможных значений для перечисления в том порядке, в котором они объявлены, и статический метод valueOf(String name) , который возвращает ссылку на константу перечисления по её имени.

Выведет:

Константные значения перечислений ( Direction.NORTH , Direction, EAST  и т. д.) являются экземплярами этого класса перечисления ( Direction ), но их можно сравнивать через == , так как для каждой из этих констант всегда будет существовать только один объект. Нельзя пытаться создать экземпляр перечисления вручную любым способом  — будет ошибка компиляции. Reflection, метод clone()  и механизм сериализации/десериализации гарантируют, что не произойдёт создания нового объекта.

Для каждого константного значения в перечислении создаётся поле с модификаторами public static final , с тем же именем, что и константное значение. Это поле имеет выражение инициализации этой константой и имеет те же аннотации, что и константное значение.

Объявление констант в перечислении позволяет указать параметры для конструктора перечисления:

Перечисление может иметь несколько конструкторов, тогда подходящий выбирается по параметрам. Перечисление не может содержать конструкторов с модификаторами доступа public  или protected. Конструктор без модификатора доступа в перечислении становится приватным ( private ).

Если в перечислении нет ни одного объявления конструктора, то автоматически добавляется конструктор по умолчанию без параметров, с модификатором доступа private  и без списка возможных исключений.

Если конструктор перечисления содержит ключевое слово super , то возникает ошибка компиляции.

Нельзя  обращаться к статическим полям перечисления, если они не являются константами (например, public static int CONST1 = 200; ), из конструкторов, блоков инициализации экземпляров, выражений инициализации.

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

Перечисление не может содержать метод-финализатор finalize() , иначе возникнет ошибка компиляции.

Цикл статей «Учебник Java 8».

Следующая статья — «Java 8 числа».
Предыдущая статья — «Java 8 наследование».

Java 8 перечисления: 2 комментария

  1. После прочтения статьи, я не понял, в чем преимущество перечислений перед обычным статическим массивом/объектом констант, хранящимся в каком-нибудь классе (как я это делал в ActionScript 3).
    =
    Нашел ответ на сторонних ресурсах.
    https://habrahabr.ru/post/101280/
    Пишут, что благодаря перечислениями можно обойтись без SWITCH.
    =
    И вот после этого я осознал всё преимущество перечислений
    :-{ )

  2. Почему когда я пишу
    Direction playerDirection = Direction.NONE;
    Программа пишет ошибку у Direction?

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

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