1. Вступ
У програмуванні часто доводиться мати справу зі списками наперед відомих і обмежених варіантів. Наприклад: дні тижня, кольори світлофора, рівні складності гри, статуси замовлення. Кожен із цих варіантів зазвичай представлений фіксованим значенням. Ось ми й наблизилися до нашої сьогоднішньої теми — перелічень (enum).
Перелічення — це спеціальний тип даних, який дає змогу оголошувати набір іменованих констант.
enum — це наче коробка з розкладеними по комірках ярличками: кожен ярличок — унікальне імʼя, повʼязане з числом.
Головні плюси enum:
- Ваш код стає читабельним і самодокументованим;
- Замість загадкових «магічних чисел» на кшталт 0, 1, 2 зʼявляються виразні імена: DayOfWeek.MONDAY або TrafficLight.RED;
- Компілятор повідомить про помилку, якщо ви спробуєте присвоїти некоректне значення;
- За кожним елементом ховається… звичайне ціле число! (Але до цього ми ще повернемося.)
Синтаксис оголошення enum
// Загальний шаблон оголошення перелічення
public enum Імʼя
{
КОНСТАНТА1 ,
КОНСТАНТА2 ,
КОНСТАНТА3
}
Оголосити перелічення в Java дуже просто. Ось базовий приклад:
// Файл DayOfWeek.java
public enum DayOfWeek {
MONDAY, // 0
TUESDAY, // 1
WEDNESDAY, // 2
THURSDAY, // 3
FRIDAY, // 4
SATURDAY, // 5
SUNDAY // 6
}
Пояснення:
- Ключове слово enum каже компілятору: «Це перелічення!»
- У фігурних дужках через кому перелічуються імена варіантів (констант).
- Прийнято писати імена у форматі UPPER_SNAKE_CASE (усі літери великі, слова розділені підкресленням).
Де можна оголошувати enum?
- В окремому файлі (DayOfWeek.java).
- Всередині класу (якщо потрібно зробити приватне перелічення лише для цього класу).
- Навіть усередині методу (але так роблять рідко).
2. Використання enum у коді
Оголошення змінної типу enum:
DayOfWeek today = DayOfWeek.MONDAY;
Тепер today може приймати лише одне зі значень, оголошених у DayOfWeek.
Приклад використання в switch
switch (today)
{
case MONDAY:
System.out.println("Ох, понеділок...");
break;
case FRIDAY:
System.out.println("Ура, пʼятниця!");
break;
default:
System.out.println("Звичайний день.");
}
Важлива відмінність: у case пишемо просто імʼя константи (без префікса), якщо тип змінної вже відомий компілятору.
Перебирання всіх значень enum
Кожен enum має статичний метод values(), який повертає масив усіх його значень:
for (DayOfWeek day : DayOfWeek.values())
{
System.out.println(day);
}
Це зручно для виведення меню, перевірок, генерації варіантів тощо.
3. Методи enum: name(), ordinal(), valueOf()
Перелічення в Java — не просто списки констант, а повноцінні класи з методами!
Метод name()
Повертає імʼя константи у вигляді рядка (як воно записане в коді):
DayOfWeek day = DayOfWeek.FRIDAY;
System.out.println(day.name()); // "FRIDAY"
Метод ordinal()
Повертає порядковий номер константи (лічба від нуля):
System.out.println(DayOfWeek.MONDAY.ordinal()); // 0
System.out.println(DayOfWeek.FRIDAY.ordinal()); // 4
Увага: не варто зберігати чи порівнювати enum за ordinal(), якщо порядок може змінитися у майбутньому! Краще використовувати імена.
Метод valueOf(String name)
Перетворює рядок на значення enum, якщо така константа існує:
DayOfWeek day = DayOfWeek.valueOf("MONDAY");
System.out.println(day); // MONDAY
Якщо рядок не збігається — буде згенеровано виняток IllegalArgumentException.
Метод values()
Повертає масив усіх значень enum (приклад уже був вище):
DayOfWeek[] days = DayOfWeek.values();
4. Enum з полями, конструктором і методами
Перелічення в Java можна розширювати: додавати поля, конструктори, методи. Так, це не просто список імен, а мініклас.
Приклад: дні тижня з локалізованою назвою
public enum DayOfWeek
{
MONDAY("Понеділок"),
TUESDAY("Вівторок"),
WEDNESDAY("Середа"),
THURSDAY("Четвер"),
FRIDAY("Пʼятниця"),
SATURDAY("Субота"),
SUNDAY("Неділя");
private final String ukrainianName;
// Конструктор (private за замовчуванням)
DayOfWeek(String ukrainianName)
{
this.ukrainianName = ukrainianName;
}
public String getUkrainianName()
{
return ukrainianName;
}
}
Детальніше про те, як це працює, ви дізнаєтеся, коли вивчатимемо ООП на глибшому рівні.
Тепер можна зробити так:
DayOfWeek day = DayOfWeek.WEDNESDAY;
System.out.println(day.getUkrainianName()); // "Середа"
Особливість: кожне значення enum має власні дані.
Переваги використання enum
- Безпека типів: не можна випадково присвоїти змінній enum значення, якого немає в списку.
- Читабельність: код сам себе документує (TrafficLight.RED замість 1 або "red").
- Зручність підтримки: якщо потрібно додати або прибрати варіант, це робиться в одному місці.
- Працює зі switch: enum ідеально підходить для розгалужень за значенням.
- Можна розширювати: додавати поля, методи, реалізовувати інтерфейси.
- Менше помилок: компілятор допоможе не забути обробити варіанти (особливо в switch-конструкціях).
5. Практика: використовуємо enum у нашому застосунку
Додаймо до нашого міні‑застосунку підтримку днів тижня через enum.
Крок 1. Оголосимо enum
public enum DayOfWeek
{
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
Крок 2. Використаємо у коді
System.out.println("Введіть день тижня (наприклад, MONDAY):");
Scanner console = new Scanner(System.in);
String input = console.nextLine().toUpperCase();
DayOfWeek day = DayOfWeek.valueOf(input);
switch (day)
{
case MONDAY:
System.out.println("Початок робочого тижня!");
break;
case FRIDAY:
System.out.println("Скоро вихідні!");
break;
case SATURDAY:
case SUNDAY:
System.out.println("Ура, вихідні!");
break;
default:
System.out.println("Звичайний робочий день.");
}
Що відбувається:
- Користувач вводить день тижня (наприклад, "monday" або "MONDAY").
- Перетворюємо рядок у верхній регістр (toUpperCase()), щоб не зважати на регістр.
- Перетворюємо рядок на значення enum через valueOf().
- Використовуємо switch для виведення різних повідомлень.
- Якщо введено некоректне значення — обробіть виняток і виведіть повідомлення про помилку.
6. Типові помилки під час роботи з enum
Помилка № 1: Використання рядків або чисел замість enum. Часто програмісти-початківці пишуть так:
int day = 1; // 1 — це понеділок?
або
String status = "DELIVERED";
Це погано: легко помилитися в написанні і важко підтримувати код. Використовуйте enum!
Помилка № 2: Порівняння enum через == і .equals(). У Java значення enum можна порівнювати через == — це безпечно, адже всі значення є унікальними в межах класу enum:
if (day == DayOfWeek.MONDAY) { ... } // ОК!
Хоча .equals() теж працює, частіше використовують ==.
Помилка № 3: Погані імена елементів enum. Не називайте елементи VALUE1, VALUE2, VALUE3 — з часом ніхто не зрозуміє, що це означає. Використовуйте осмислені імена.
Помилка № 4: Використання ordinal() для логіки. Не пишіть так:
if (day.ordinal() == 0) { ... } // Не треба!
Порядок елементів може змінитися — і все зламається. Використовуйте імена!
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ