0Pricing
Java Academy · Урок

Определение и использование перечислений

Объявляйте типы enum, используйте их константы и перебирайте их с помощью values() и ordinal().

«Определение и использование перечислений» — бесплатный урок Java Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.

Определение и использование перечислений

Перечисление (enum) — это особый класс, представляющий фиксированный набор констант. Перечисления безопасны с точки зрения типов, понятны для чтения и мощнее статических констант int.

Объявление перечисления

Используйте ключевое слово enum, чтобы объявить перечисление. Каждая константа неявно является public static final и экземпляром типа перечисления.

enum Day {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY,
    FRIDAY, SATURDAY, SUNDAY
}

Day today = Day.WEDNESDAY;
System.out.println(today);          // WEDNESDAY
System.out.println(today.name());   // WEDNESDAY
System.out.println(today.ordinal()); // 2 (zero-based index)

Итерация с помощью values()

EnumType.values() возвращает все константы в порядке объявления. Используйте его для итерации или создания меню.

enum Planet { MERCURY, VENUS, EARTH, MARS, JUPITER, SATURN, URANUS, NEPTUNE }

for (Planet p : Planet.values()) {
    System.out.println(p.ordinal() + ": " + p);
}
// 0: MERCURY
// 1: VENUS
// 2: EARTH
// ...

// Count constants
System.out.println(Planet.values().length); // 8

valueOf() и разбор значения

Enum.valueOf(name) преобразует String в соответствующую константу. Если константа не найдена, возникает IllegalArgumentException.

enum Status { PENDING, ACTIVE, SUSPENDED, CLOSED }

String input = "ACTIVE";
Status s = Status.valueOf(input);
System.out.println(s); // ACTIVE

try {
    Status bad = Status.valueOf("UNKNOWN");
} catch (IllegalArgumentException e) {
    System.out.println("Invalid status: UNKNOWN");
}

// Safe parse pattern
static Status safeFrom(String name) {
    try { return Status.valueOf(name.toUpperCase()); }
    catch (IllegalArgumentException e) { return Status.PENDING; }
}

Использование перечислений в операторе выбора

Перечисления прекрасно работают в операторах и выражениях выбора. Современные выражения выбора делают обработку перечислений лаконичной и исчерпывающей.

enum OrderStatus { CREATED, PROCESSING, SHIPPED, DELIVERED, CANCELLED }

OrderStatus status = OrderStatus.SHIPPED;

String message = switch (status) {
    case CREATED     -> "Order received, awaiting payment";
    case PROCESSING  -> "Payment confirmed, preparing shipment";
    case SHIPPED     -> "On the way — track your package";
    case DELIVERED   -> "Delivered! Enjoy your order";
    case CANCELLED   -> "Order cancelled";
};
System.out.println(message); // On the way — track your package

Перечисления с условными конструкциями

Для сравнения констант перечисления используйте ==: это одиночные экземпляры, поэтому сравнение ссылок работает корректно.

enum UserRole { GUEST, MEMBER, ADMIN, SUPERADMIN }

UserRole role = UserRole.ADMIN;

if (role == UserRole.ADMIN || role == UserRole.SUPERADMIN) {
    System.out.println("Access granted to admin panel");
} else {
    System.out.println("Access denied");
}

// Enum comparison: never use .equals() for enums
// == is correct and more readable

Перечисления в коллекциях

Перечисления можно хранить в стандартных коллекциях. Используйте EnumSet и EnumMap для высокопроизводительного хранения на основе перечислений (это рассматривается в одном из следующих уроков).

import java.util.*;

enum Permission { READ, WRITE, DELETE, ADMIN }

Set<Permission> userPerms = new HashSet<>();
userPerms.add(Permission.READ);
userPerms.add(Permission.WRITE);

System.out.println(userPerms.contains(Permission.DELETE)); // false
System.out.println(userPerms.contains(Permission.READ));   // true

List<Permission> allPerms = Arrays.asList(Permission.values());
System.out.println(allPerms.size()); // 4

Перечисления реализуют интерфейсы

Перечисления могут реализовывать интерфейсы, что позволяет присоединить поведение к каждой константе или определить общий контракт для всех констант.

interface Describable {
    String describe();
}

enum Season implements Describable {
    SPRING, SUMMER, FALL, WINTER;

    public String describe() {
        return switch (this) {
            case SPRING -> "Mild and rainy";
            case SUMMER -> "Hot and sunny";
            case FALL   -> "Cool with falling leaves";
            case WINTER -> "Cold and snowy";
        };
    }
}

for (Season s : Season.values()) {
    System.out.println(s + ": " + s.describe());
}

Перечисление как конечный автомат

Перечисления естественным образом подходят для конечных автоматов. Каждая константа представляет состояние, а методы определяют допустимые переходы.

enum TrafficLight {
    RED, YELLOW, GREEN;

    public TrafficLight next() {
        return switch (this) {
            case RED    -> GREEN;
            case GREEN  -> YELLOW;
            case YELLOW -> RED;
        };
    }
}

TrafficLight light = TrafficLight.RED;
for (int i = 0; i < 6; i++) {
    System.out.println(light);
    light = light.next();
}
// RED, GREEN, YELLOW, RED, GREEN, YELLOW

Рекомендации по использованию перечислений

Следуйте этим рекомендациям при работе с перечислениями:

  • Используйте ПРОПИСНЫЕ_ИМЕНА для констант (согласно соглашению)
  • Предпочитайте перечисления константам int или String для обеспечения безопасности типов
  • Используйте выражения выбора для исчерпывающей обработки вариантов
  • Добавляйте в перечисления поля и методы, если константы содержат данные

Практика: коды состояния HTTP

Практическое перечисление для моделирования категорий состояний HTTP с фабричным методом, создающим значение по числовому коду.

enum HttpStatus {
    OK(200), CREATED(201), BAD_REQUEST(400),
    UNAUTHORIZED(401), NOT_FOUND(404), SERVER_ERROR(500);

    public final int code;

    HttpStatus(int code) { this.code = code; }

    public static HttpStatus from(int code) {
        for (HttpStatus s : values())
            if (s.code == code) return s;
        throw new IllegalArgumentException("Unknown HTTP code: " + code);
    }

    public boolean isSuccess() { return code >= 200 && code < 300; }
}

HttpStatus s = HttpStatus.from(404);
System.out.println(s + " (" + s.code + ") success=" + s.isSuccess());
// NOT_FOUND (404) success=false

Быстрая проверка

Каков результат выполнения следующего кода?

enum Color { RED, GREEN, BLUE }
System.out.println(Color.GREEN.ordinal());

Итоги: определение и использование перечислений

Главные выводы:

  • Перечисления задают фиксированный набор именованных констант с проверкой типов
  • values() перебирает все константы, а ordinal() возвращает индекс, начинающийся с нуля
  • valueOf() преобразует String в соответствующую константу
  • Для сравнения экземпляров перечисления используйте == (а не equals)
  • Перечисления отлично подходят для выражений выбора с исчерпывающей обработкой вариантов
  • Перечисления могут реализовывать интерфейсы, чтобы задавать поведение для каждой константы

Часто задаваемые вопросы

Урок «Определение и использование перечислений» бесплатный?

Да — полный текст урока «Определение и использование перечислений» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.

Чему я научусь в уроке «Определение и использование перечислений»?

Объявляйте типы enum, используйте их константы и перебирайте их с помощью values() и ordinal(). Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Java Academy?

Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Определение и использование перечислений»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Java Academy?

Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Определение и использование перечислений
  2. Перечисления с полями и методами
  3. Выражения switch с перечислениями
  4. EnumSet и EnumMap
← Назад к Java Academy