Menu
Coddy logo textTech

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

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

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

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

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

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

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() возвращает массив всех constants, а valueOf() преобразует строку в соответствующую константу enum. Метод ordinal() возвращает позицию константы (начиная с 0):

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

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

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

challenge icon

Задание

Легко

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

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

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

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

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

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

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

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

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

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

Обратите внимание, как enum инкапсулирует both идентификатор размера и связанную с ним цену — это гораздо более чистый подход, чем использование отдельных constants или magic numbers в вашем коде!

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

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 в enum CoffeeSize с помощью valueOf()
        
        // TODO: Создать Order с именем клиента и размером
        
        // TODO: Напечатать чек
        
        // TODO: Напечатать пустую строку
        
        // TODO: Отобразить полное меню, перебирая все значения CoffeeSize
        // Подсказка: Используйте CoffeeSize.values() чтобы получить все константы enum
        
    }
}
quiz iconПроверьте себя

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

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

Потренируйтесь самостоятельно: Онлайн-компилятор Java