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;
1) Клас Direction обов'язково наслідує від класу Enum, тому його не можна успадкувати більше ні від чого.
2) Клас Direction оголошений final, тому від нього не можна нічого успадкувати.
3) Набір значень класу Direction насправді - це public static final змінні типу Direction. Що видно за кодом їх використання: Direction direction = Direction.LEFT;
4) Клас Direction містить тільки один конструктор і той - приватний. Це означає, що об'єкти класу Direction можна створити тільки в коді усередині класу. Окрім оголошених об'єктів, інших об'єктів створити не можна.
5) Змінним типу Direction можна присвоювати посилання набудь-який з існуючих об'єктів типу Direction - усі вони визначені у нього усередині. Інших об'єктів цього типу немає, і не буде.
6) Об'єктів типу 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();
int index = direction.ordinal();
int index2 = Direction.RIGHT.ordinal();
int leftIndex = Direction.LEFT.ordinal();
Direction[] array = Direction.values();
Direction left = array[leftIndex];
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.