JavaRush /Курси /JAVA 25 SELF /Перелічення: enum

Перелічення: enum

JAVA 25 SELF
Рівень 10 , Лекція 4
Відкрита

1. Вступ

У програмуванні часто доводиться мати справу зі списками наперед відомих і обмежених варіантів. Наприклад: дні тижня, кольори світлофора, рівні складності гри, статуси замовлення. Кожен із цих варіантів зазвичай представлений фіксованим значенням. Ось ми й наблизилися до нашої сьогоднішньої теми — перелічень (enum).

Перелічення — це спеціальний тип даних, який дає змогу оголошувати набір іменованих констант.

enum — це наче коробка з розкладеними по комірках ярличками: кожен ярличок — унікальне імʼя, повʼязане з числом.

Головні плюси enum:

  • Ваш код стає читабельним і самодокументованим;
  • Замість загадкових «магічних чисел» на кшталт 0, 1, 2 зʼявляються виразні імена: DayOfWeek.MONDAY або TrafficLight.RED;
  • Компілятор повідомить про помилку, якщо ви спробуєте присвоїти некоректне значення;
  • За кожним елементом ховається… звичайне ціле число! (Але до цього ми ще повернемося.)

Синтаксис оголошення enum


// Загальний шаблон оголошення перелічення
public enum Імʼя
{
    КОНСТАНТА1 ,
    КОНСТАНТА2 ,
    КОНСТАНТА3
}
Синтаксис оголошення перелічення enum

Оголосити перелічення в 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) { ... } // Не треба!

Порядок елементів може змінитися — і все зламається. Використовуйте імена!

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ