Menu
Coddy logo textTech

Enums и методы перечислений

Часть раздела Объектно-ориентированное программирование путешествия по Java на Coddy — урок 50 из 87.

enum (перечисление) — это специальный тип класса, который представляет фиксированный набор констант. Вместо использования произвольных целых чисел или строк для представления таких опций, как дни недели или статусы заказов, перечисления (enums) предоставляют типобезопасные и читаемые значения.

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

Day today = Day.MONDAY;
System.out.println(today);  // Выводит: MONDAY

Enums — это больше, чем просто константы, это полноценные классы. Вы можете добавлять в них поля, конструкторы и методы:

enum Size {
    SMALL(10), MEDIUM(20), LARGE(30);
    
    private int price;
    
    Size(int price) {
        this.price = price;
    }
    
    public int getPrice() {
        return price;
    }
}

System.out.println(Size.MEDIUM.getPrice());  // Выводит: 20

Каждое перечисление (enum) содержит полезные встроенные методы. Метод values() возвращает массив всех констант, в то время как valueOf() преобразует строку в соответствующую константу перечисления. Метод ordinal() возвращает позицию константы (начиная с 0):

for (Day d : Day.values()) {
    System.out.println(d + " is at position " + d.ordinal());
}

Day day = Day.valueOf("FRIDAY");  // Преобразует строку в enum

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

challenge icon

Задание

Легко

Давайте создадим систему заказа в кофейне, которая продемонстрирует возможности перечислений (enums) с полями, конструкторами и методами. Вы создадите перечисление CoffeeSize, которое хранит информацию о ценах, и систему для обработки заказов клиентов.

Вы организуете свой код в трех файлах:

  • CoffeeSize.java: Создайте перечисление, представляющее размеры кофе с соответствующими ценами. Ваше перечисление должно иметь три константы: SMALL, MEDIUM и LARGE с ценами 2.50, 3.50 и 4.50 соответственно.

    Для каждого размера требуется приватное поле price (double), конструктор для его установки и метод getPrice() для его получения. Также добавьте метод getDescription(), который возвращает строку в формате: [size name] - $[price] (например: SMALL - $2.5)

  • Order.java: Создайте класс, представляющий заказ кофе. У заказа есть два приватных поля: customerName (String) и size (CoffeeSize). Включите конструктор для инициализации обоих полей и методы-геттеры для каждого из них.

    Добавьте метод getReceipt(), который возвращает многострочную строку:

    Order for: [customerName]
    Size: [size description from getDescription()]
    Total: $[price from the size]
  • Main.java: Оживите свою кофейню! Вы получите два входных значения: имя клиента (String) и название размера (String, например, "SMALL", "MEDIUM" или "LARGE").

    Сначала используйте CoffeeSize.valueOf(), чтобы преобразовать строку размера в соответствующую константу перечисления. Создайте объект Order с именем клиента и размером, а затем выведите чек.

    После вывода чека выведите пустую строку, а затем отобразите полное меню, перебрав все значения CoffeeSize с помощью метода values(). Для каждого размера выведите его описание на отдельной строке.

Вы получите два входных значения по порядку: имя клиента и название размера (одно из "SMALL", "MEDIUM" или "LARGE").

Обратите внимание, как перечисление инкапсулирует как идентификатор размера, так и связанную с ним цену — это гораздо чище, чем использование отдельных констант или «магических чисел» во всем коде!

Шпаргалка

Enum (перечисление) — это специальный тип класса, представляющий фиксированный набор констант, обеспечивающий типобезопасные и читаемые значения:

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

Day today = Day.MONDAY;
System.out.println(today);  // Prints: MONDAY

Перечисления могут иметь поля, конструкторы и методы:

enum Size {
    SMALL(10), MEDIUM(20), LARGE(30);
    
    private int price;
    
    Size(int price) {
        this.price = price;
    }
    
    public int getPrice() {
        return price;
    }
}

System.out.println(Size.MEDIUM.getPrice());  // Prints: 20

Встроенные методы перечислений:

  • values() — возвращает массив всех констант перечисления
  • valueOf(String) — преобразует строку в соответствующую константу перечисления
  • ordinal() — возвращает позицию константы (начиная с 0)
for (Day d : Day.values()) {
    System.out.println(d + " is at position " + d.ordinal());
}

Day day = Day.valueOf("FRIDAY");  // Converts string to enum

Попробуйте сами

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Чтение входных данных
        String customerName = scanner.nextLine();
        String sizeName = scanner.nextLine();
        
        // TODO: Преобразуйте sizeName в перечисление CoffeeSize, используя valueOf()
        
        // TODO: Создайте заказ (Order) с именем клиента и размером
        
        // TODO: Распечатайте чек
        
        // TODO: Распечатайте пустую строку
        
        // TODO: Отобразите полное меню, перебрав все значения CoffeeSize
        // Подсказка: используйте CoffeeSize.values(), чтобы получить все константы перечисления
        
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование