Рубрики
Без рубрики

Приведение int к перечислению в Java

Узнайте, как привести int к перечислению в Java

Автор оригинала: baeldung.

1. Обзор

В этом уроке мы кратко рассмотрим различные способы приведения int к значению enum в Java. Хотя прямого способа кастинга нет, есть несколько способов приблизить его.

2. Использование значений Enum#

Во-первых, давайте посмотрим, как мы можем решить эту проблему, используя метод Enum ‘s values /.

Давайте начнем с создания перечисления Статус пиццы , которое определяет статус заказа на пиццу:

public enum PizzaStatus {
    ORDERED(5),
    READY(2),
    DELIVERED(0);

    private int timeToDelivery;

    PizzaStatus (int timeToDelivery) {
        this.timeToDelivery = timeToDelivery;
    }

    // Method that gets the timeToDelivery variable.
}

Мы связываем каждое постоянное значение перечисления с полем время доставки . При определении постоянных перечислений мы передаем поле time To Delivery конструктору.

Метод static values возвращает массив, содержащий все значения перечисления в порядке их объявления. Поэтому мы можем использовать время до доставки целочисленное значение, чтобы получить соответствующее значение перечисления:

int timeToDeliveryForOrderedPizzaStatus = 5;

PizzaStatus pizzaOrderedStatus = null;

for (PizzaStatus pizzaStatus : PizzaStatus.values()) {
    if (pizzaStatus.getTimeToDelivery() == timeToDeliveryForOrderedPizzaStatus) {
        pizzaOrderedStatus = pizzaStatus;
    }
}

assertThat(pizzaOrderedStatus).isEqualTo(PizzaStatus.ORDERED);

Здесь мы используем массив, возвращаемый Pizza Status.values () , чтобы найти соответствующее значение на основе свойства time To Delivery .

Однако этот подход довольно многословен. Кроме того, это также неэффективно , так как каждый раз, когда мы хотим получить соответствующий статус Pizza , нам нужно перебирать PizzaStatus.values() .

2.1. Использование потока Java 8

Давайте посмотрим, как мы можем найти соответствующий Статус пиццы , используя подход Java 8:

int timeToDeliveryForOrderedPizzaStatus = 5;

Optional pizzaStatus = Arrays.stream(PizzaStatus.values())
  .filter(p -> p.getTimeToDelivery() == timeToDeliveryForOrderedPizzaStatus)
  .findFirst();

assertThat(pizzaStatus).hasValue(PizzaStatus.ORDERED);

Этот код выглядит более лаконичным, чем тот, который использует цикл for . Однако, тем не менее, мы повторяем Pizza Status.values() каждый раз, когда нам нужно получить соответствующее перечисление.

Кроме того, обратите внимание, что при таком подходе мы получаем Необязательный<Статус пиццы> вместо Статуса пиццы непосредственно .

3. Использование карты

Далее, давайте использовать структуру данных Java Map вместе с методом values для извлечения значения перечисления, соответствующего времени доставки целочисленного значения.

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

Мы используем статическую карту time To Delivery To Enum Values Mapping внутренне, которая обрабатывает отображение времени для доставки к соответствующему значению enum.

Кроме того, метод values класса Enum предоставляет все значения перечисления. В блоке static мы перебираем массив значений перечисления и добавляем их на карту вместе с соответствующим временем, чтобы получить целочисленное значение в качестве ключа:

private static Map timeToDeliveryToEnumValuesMapping = new HashMap<>();

static {
    for (PizzaStatus pizzaStatus : PizzaStatus.values()) {
        timeToDeliveryToEnumValuesMapping.put(
          pizzaStatus.getTimeToDelivery(),
          pizzaStatus
        );
    }
}

Наконец, мы создаем статический метод, который принимает время Доставки целое число в качестве параметра. Этот метод возвращает соответствующее значение перечисления, используя статическую карту время доставки Для сопоставления значений перечисления :

public static PizzaStatus castIntToEnum(int timeToDelivery) {
    return timeToDeliveryToEnumValuesMapping.get(timeToDelivery);
}

Используя статическую карту и статический метод, мы получаем значение перечисления, соответствующее времени доставки целочисленного значения.

4. Заключение

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

Как всегда, все эти примеры кода доступны на GitHub .