Работа с enum на языке Java

Enum является перечисляемым типом данных, который хранит в себе одну или набор связанных констант. С одой стороны, тип enum напоминает массив констант, однако предоставляет большой набор возможностей как для доступа, так и формирования своих констант.

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

Синтаксис создания простого перечисления

Простой набор связанных констант создается следующим образом:

enum Countries{
Russia,
USA,
England,
France,
Japan
}

Все константы перечисляются через запятую, а последняя остается без знака препинания. Для того, чтобы получить доступ к какой-либо константе перечисления, требуется создать переменную типа enum:

Contries country = Countries.Russia;
System.out.print(country); \\ Russia — вариант доступа к константе через переменную enum
System.out.print(Countries.Russia); \\ Russia — вывод значения без первоначального сохранения в переменную

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

Поскольку Russia является первой константой, то ее порядковый номер равен 0. По умолчанию, каждая константа имеет свой порядковый номер. Однако каждой из них можно присвоить отдельное значение. Но для этого придется описывать enum практически как класс.

Пример создания перечисления со значениями и конструкторами:

\\ Создадим enum с городами, каждый из которых предоставляет адрес некого филиала

enumFilials_Cities {

privateStringadress; \\ Создаем приватное вспомогательное поле для конструктора и присвоения каждой константе адреса

publicStringget_adress(){ \\ Метод для получения адреса в каждом городе
returnadress;
}

Filials_Cities(String set_adress){ Конструктор создания города и адреса
this.adress = set_adress;
}

\\ Создание констант перечислений через конструктор с присвоением каждой из них значения.
London(«Parker-street 22»),
Moscow(«ул. Пархоменко дом №22»),
Tokyo(«Otemati 25»)
}

В примере выше мы создали сложную структуру enum и добавили ей функциональность. Теперь можно ей и воспользоваться.

Пример:

System.out.println(Filials_Cities.London); \\ выведет London
System.out.println(Filials_Cities.London.get_adress()); \\ выведет Parker-street 22

Определение индивидуальных методов для отдельных констант

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

Пример определения индивидуальных методов:

\\ Задаем enum с индивидуальными математическими методами
enumMath_op{

public abstract int operate(int a, int b);

ADD{
publicint operate(int a, int b){return a+b;}
}
SUBSTRACT{
publicint operate(int a, int b){return a-b;}
}
MULT{
publicint operate(int a, int b){return a*b;}
}
DIV{
publicint operate(int a, int b){return a+b;}
}
DIV_with_REMAINDER{
publicint operate(int a, int b){return a%b;}
}
}

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

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

Теперь можно воспользоваться возможностями нашей Math_op:

System.out.println(Math_op.ADD.operate(5, 5)); \\ выведет «10», как результат срабатывания метода
System.out.println(Math_op.SUBSTRACT.operate(5, 5)); \\ 0
System.out.println(Math_op.MULT.operate(5, 5)); \\ 25
System.out.println(Math_op.DIV.operate(5, 5)); \\ 1
System.out.println(Math_op.DIV_with_REMAINDER.operate(5, 5)); \\ 0

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

Встроенные методы для enum

Статический метод values() возвращает массив всех констант, находящихся в определенной enum:

enum Numbers{
ONE,
TWO,
THREE,
FOUR,
FIVE
}

\\ получение массива
Numbers[] num_arr = Numbers.values();
for (Numbers n : num_arr) {
System.out.println(n);
} \\ ONE, TWO, THREE, FOUR, FIVE

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

System.out.println(Numbers.ONE.ordinal()); \\ 0
System.out.println(Numbers.TWO.ordinal()); \\ 1
System.out.println(Numbers.THREE.ordinal()); \\ 2
System.out.println(Numbers.FOUR.ordinal()); \\ 3

Особенности констант

Стоит упомянуть, что при присвоении значений константам через конструктор, их значения уже нельзя изменить — это приведет к возникновению ошибки. Значение можно изменить только в том случае, если каждой константе присваиваются индивидуальные методы. Однако результаты этих методов представляют собой не значение константы, а отдельный результат выполнения метода.

Значение константе задается через конструктор. Если значение у константы отсутствует, что оно равно текущему порядковому номеру константы, который можно определить через метод ordinal().

Заключение

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

Enum представляет собой примитив, поэтому константы хранятся в стеке, а не куче. Нельзя присвоить переменной одного типа enum другое перечисление — это приведет к ошибке. Нельзя выделить какое-либо назначение для перечислимого типа.

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

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

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