Java - Строки перечислений (Enum)

Привет, начинающие программисты на Java! Сегодня мы погрузимся в увлекательный мир строк перечислений (Enum Strings) в Java. Не волнуйтесь, если вы совершенно новичок в программировании – я веду вас шаг за шагом, как я делал это для многих студентов на протяжении многих лет своей преподавательской деятельности. Давайте отправимся в этот захватывающий путь вместе!

Java - Enum Strings

Что такое перечисления (Enums)?

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

Представьте себе, что вы создаете программу для кофейни. Вы можете иметь фиксированный набор размеров стаканов: МАЛЕНЬКИЙ, СРЕДНИЙ и БОЛЬШОЙ. Это идеальный случай для использования перечисления!

Вот как мы можем определить это перечисление:

public enum CupSize {
МАЛЕНЬКИЙ,
СРЕДНИЙ,
БОЛЬШОЙ
}

Теперь посмотрим, как мы можем использовать это перечисление в нашем коде:

public class CoffeeShop {
public static void main(String[] args) {
CupSize myOrder = CupSize.СРЕДНИЙ;
System.out.println("Я бы хотел " + myOrder + " кофе, пожалуйста!");
}
}

Когда вы выполните этот код, он выведет: "Я бы хотел СРЕДНИЙ кофе, пожалуйста!"

Строки перечислений: Более детальный разгляд

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

В этом помогает метод toString(). Улучним наше перечисление CupSize, чтобы предоставлять более описательные строки:

public enum CupSize {
МАЛЕНЬКИЙ("Маленький (8 oz)"),
СРЕДНИЙ("Средний (12 oz)"),
БОЛЬШОЙ("Большой (16 oz)");

private final String description;

CupSize(String description) {
this.description = description;
}

@Override
public String toString() {
return this.description;
}
}

Рассмотрим, что здесь происходит:

  1. Мы добавили поле description к нашему перечислению.
  2. Создали конструктор, который принимает это описание в качестве параметра.
  3. Переопределили метод toString(), чтобы возвращать наше пользовательское описание.

Теперь используем наше улучшенное перечисление:

public class CoffeeShop {
public static void main(String[] args) {
CupSize myOrder = CupSize.СРЕДНИЙ;
System.out.println("Я бы хотел " + myOrder + " кофе, пожалуйста!");
}
}

На этот раз, когда вы выполните код, он выведет: "Я бы хотел Средний (12 oz) кофе, пожалуйста!"

Ни что себе! Мы настроили, как наши значения перечисления будут представляться в виде строк!

Работа с строками перечислений

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

Преобразование перечисления в строку

Мы уже видели, как преобразовать перечисление в строку с помощью метода toString(). Но есть еще один способ получить имя константы перечисления в виде строки:

CupSize size = CupSize.БОЛЬШОЙ;
String sizeName = size.name();
System.out.println("Имя перечисления: " + sizeName);

Это выведет: "Имя перечисления: БОЛЬШОЙ"

Преобразование строки в перечисление

Что если у вас есть строка, и вы хотите преобразовать ее обратно в перечисление? Вы можете использовать метод valueOf():

String sizeString = "МАЛЕНЬКИЙ";
CupSize size = CupSize.valueOf(sizeString);
System.out.println("Преобразованное перечисление: " + size);

Это выведет: "Преобразованное перечисление: Маленький (8 oz)"

Итерация по значениям перечисления

Иногда вы можете захотеть итерироваться по всем значениям в перечислении. Вы можете сделать это с помощью метода values():

System.out.println("Доступные размеры стаканов:");
for (CupSize size : CupSize.values()) {
System.out.println("- " + size);
}

Это выведет:

Доступные размеры стаканов:
- Маленький (8 oz)
- Средний (12 oz)
- Большой (16 oz)

Практический пример: Система заказа кофе

Поместим все, что мы выучили, в более полном примере. Создадим простую систему заказа кофе:

import java.util.Scanner;

public enum CoffeeType {
ESPRESSO("Сильный кофе, приготовленный путем принуждения горячей воды под давлением через тонко помолотые зерна кофе."),
LATTE("Эспрессо с нагретым молоком и небольшим слоем пены на верху."),
CAPPUCCINO("Равные части эспрессо, нагретого молока и пены.");

private final String description;

CoffeeType(String description) {
this.description = description;
}

@Override
public String toString() {
return name() + ": " + this.description;
}
}

public class CoffeeShop {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);

System.out.println("Добро пожаловать в нашу кофейню!");
System.out.println("Вот наши доступные типы кофе:");
for (CoffeeType type : CoffeeType.values()) {
System.out.println("- " + type);
}

System.out.print("Какой тип кофе вы хотите? ");
String userChoice = scanner.nextLine().toUpperCase();

try {
CoffeeType chosenCoffee = CoffeeType.valueOf(userChoice);
System.out.println("Отличный выбор! Вы заказали " + chosenCoffee.name().toLowerCase() + ".");
} catch (IllegalArgumentException e) {
System.out.println("Извините, у нас нет такого типа кофе.");
}

scanner.close();
}
}

Эта программа выполняет следующее:

  1. Мы определяем перечисление CoffeeType с описаниями для каждого типа кофе.
  2. В методе main мы отображаем все доступные типы кофе для пользователя.
  3. Мы спрашиваем пользователя о его выборе типа кофе.
  4. Мы пытаемся преобразовать ввод пользователя в перечисление CoffeeType.
  5. Если успешно, мы подтверждаем его заказ. Если нет, мы сообщаем ему, что у нас нет такого типа кофе.

Заключение

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

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

Успехов в практике, остайтесь любознательными и счастливого кодирования!

Credits: Image by storyset