Enum, всі особливості - 1

— Привіт, Аміго!

— Привіт, Білаабо!

— Я розповім тобі про дуже цікаву штуку. Вона досить проста, але від цього стає ще цікавіше. Ця штука називається enum. 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, всередині через кому пишемо його можливі значення.

Використовувати його теж досить просто.

— А йому можна надавати null?

— Так, enum – це звичайний клас – вірніше, один із його різновидів, таких як interface.

— Тобто. скрізь, де я можу використати клас, я можу використати enum?

— Так.

— А усередині класу можна оголосити enum?

— Так.

— А успадкуватись від enum?

— Ні, ні успадковуватись від enum, ні успадковувати enum не можна.

— А чому?

— Тому що Java-компілятор перетворює enum приблизно ось на це:

public final class Direction< /strong> 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 = < span class="text-green">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'а перевизначено метод toString? Він же не виводить на екран щось на зразок
"com.javarush.Direction@123fd4"?

— Так, навіть у кожного enum'а, а значить і у Direction є можливість перетворити його в рядок і назад.

Перетворення в рядок:
String left = Direction.LEFT.toString(); // left == "LEFT";
Перетворення рядка в enum:
Direction direction = Direction.valueOf("LEFT");

— О, зрозуміло.

А що буде, якщо в функцію valueOf передати рядок, якого немає в Direction? Наприклад, «AMIGO»?

— А ти як думаєш?

— Exception?

— Ага. IllegalArgumentException.

На цьому наше введення у світ enum'ів закінчено.