Назад Зміст Вперед

3.2. Використання еnum

Enum – це тип, заданий перерахуванням набору значень, які можуть приймати його змінні.

Приклад:
Визначення класу - enum
public enum Direction
{
 UP,
 DOWN,
 LEFT,
 RIGHT,
}

Використання enum’а
Direction direction = Direction.LEFT;

if (direction == Direction.LEFT)
 direction = Direction.RIGHT;
else
 direction = Direction.DOWN;
Отже, enum - це звичайний клас - вірніше, один з його різновидів, таких як interface. Тобто скрізь, де можна використати клас, можна використати enum. Усередині класу можна оголосити enum. Проте, ні наслідувати від enum, ні наслідувати enum не можна. Тому що Java- компілятор перетворює enum приблизно ось в це:


public final class Direction extends Enum
{
 
public static final Direction UP = new Direction();
 
public static final Direction DOWN = new Direction();
 
public static final Direction LEFT = new Direction();
 
public static final Direction RIGHT = new Direction();

 
private Direction() {} //
конструктор
}

Як видно з цього прикладу:
1) Клас Direction обов'язково наслідує від класу Enum, тому його не можна успадкувати більше ні від чого.
2) Клас Direction оголошений final, тому від нього не можна нічого успадкувати.
3) Набір значень класу Direction насправді - це public static final змінні типу Direction. Що видно за кодом їх використання: Direction direction = Direction.LEFT;
4) Клас Direction містить тільки один конструктор і той - приватний. Це означає, що об'єкти класу Direction можна створити тільки в коді усередині класу. Окрім оголошених об'єктів, інших об'єктів створити не можна.
5) Змінним типу Direction можна присвоювати посилання набудь-який з існуючих об'єктів типу Direction - усі вони визначені у нього усередині. Інших об'єктів цього типу немає, і не буде.
6) Об'єктів типу Direction можна порівнювати за допомогою знаку "==" - це буде просто порівняння посилань.

Отже, 
1) У кожного об'єкту типу Direction є його унікальний номер. У першого (UP) - 0, у другого (DOWN) - 1, у третього (LEFT) - 2, і так далі. Отримати цей номер можна за допомогою методу ordinal ():
Direction direction = Direction.LEFT;
int index = direction.ordinal();
int index2 = Direction.RIGHT.ordinal();

2) У кожного enum 'а є метод values (), який повертає масив значень enum 'а.
int leftIndex = Direction.LEFT.ordinal();
Direction[] array = Direction.values();
Direction left = array[leftIndex];

Можна у будь-якого елементу enum 'а отримати його номер, а потім за номером знову отримати елемент. А ще можна використати enum в циклі foreach :

for (Direction direction : Direction.values())
{
 
System.out.println(direction);
}
Вивід на екран:
UP
DOWN
LEFT
RIGHT

У enum 'а перевизначений метод String і у Direction є можливість перетворити його в рядок і назад.
Перетворення у рядок:
String left = Direction.LEFT.toString()// left == "LEFT";
Перетворення рядка в enum:
Direction direction = Direction.valueOf("LEFT");

Якщо у функцію valueOf передати рядок, якого немає в Direction, то буде IllegalArgumentException.


.