Enums и методы перечислений
Часть раздела Объектно-ориентированное программирование путешествия по Java на Coddy — урок 50 из 87.
enum (перечисление) — это специальный тип класса, который представляет фиксированный набор констант. Вместо использования произвольных целых чисел или строк для представления таких опций, как дни недели или статусы заказов, перечисления (enums) предоставляют типобезопасные и читаемые значения.
enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
Day today = Day.MONDAY;
System.out.println(today); // Выводит: MONDAYEnums — это больше, чем просто константы, это полноценные классы. Вы можете добавлять в них поля, конструкторы и методы:
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) идеально подходят в тех случаях, когда у вас есть известный, фиксированный набор значений, которые не будут меняться во время выполнения, что делает ваш код более безопасным и выразительным, чем использование обычных констант.
Задание
ЛегкоДавайте создадим систему заказа в кофейне, которая продемонстрирует возможности перечислений (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(), чтобы получить все константы перечисления
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово thisМетодыПоля (атрибуты)Метод-конструкторПерегрузка конструкторовИтоги — Простой калькулятор4Наследование
Основы наследования (extends)Ключевое слово superПереопределение методов (@Override)Цепочка конструкторовКласс ObjectОдиночное и многоуровневое наследованиеПочему нет множественного наследования классовИтоги — Иерархия сотрудников7Специальные методы и класс Object
Метод toString()equals() и hashCode()Метод clone()compareTo() и ComparableИнтерфейс ComparatorПовторение — Кастомная сортировка2Модификаторы доступа и инкапсуляция
Обзор уровней доступаМетоды геттеры и сеттерыСокрытие данныхКлючевое слово finalИтоги — Менеджер банковского счета5Полиморфизм
Основы перегрузки методовПереопределение методов (Run-Time)Upcasting и DowncastingОператор instanceofАбстрактные классы и методыИтоги: Калькулятор фигур8Продвинутые концепции ООП
Композиция против наследованияАгрегация против композицииВнутренние, вложенные и анонимные классыEnums и методы перечисленийRecords (Java 16+)Sealed-классы (Java 17+)11Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн BuilderПаттерн ObserverПаттерн Strategy3Свойства класса и статические члены
Переменные экземпляра и статические переменныеСтатические методыСтатические блокиКонстанты (static final)Итоги: Счетчик и утилиты6Интерфейсы и абстрактные классы
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовDefault и Static методы в интерфейсахАбстрактные классы vs ИнтерфейсыФункциональные интерфейсыИтоги — Платежная система9Обобщения
Введение в обобщенияОбобщенные классыОбобщенные методыОграниченные параметры типаСимволы подстановки (Wildcards: ?, extends, super)Итоги — Обобщенный контейнер12Паттерны проектирования. Часть 2
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»Паттерн «Итератор»