Conversión de int a Enum en Java

1. Información general

En este tutorial, veremos brevemente las diferentes formas de convertir un int a un valor de enumeración en Java. Aunque no hay una forma directa de emitir, hay un par de formas de aproximarlo.

2. Usando valores de Enum #

En primer lugar, Echemos un vistazo a cómo podemos resolver este problema mediante el uso de la enumeración 's valores de método.

Comencemos creando una enumeración PizzaStatus que define el estado de un pedido de pizza:

public enum PizzaStatus { ORDERED(5), READY(2), DELIVERED(0); private int timeToDelivery; PizzaStatus (int timeToDelivery) { this.timeToDelivery = timeToDelivery; } // Method that gets the timeToDelivery variable. }

Asociamos cada valor de enumeración constante con el campo timeToDelivery . Al definir las enumeraciones constantes, pasamos el campo timeToDelivery al constructor.

El método de valores estáticos devuelve una matriz que contiene todos los valores de la enumeración en el orden de su declaración. Por lo tanto, podemos usar el valor entero timeToDelivery para obtener el valor de enumeración correspondiente:

int timeToDeliveryForOrderedPizzaStatus = 5; PizzaStatus pizzaOrderedStatus = null; for (PizzaStatus pizzaStatus : PizzaStatus.values()) { if (pizzaStatus.getTimeToDelivery() == timeToDeliveryForOrderedPizzaStatus) { pizzaOrderedStatus = pizzaStatus; } } assertThat(pizzaOrderedStatus).isEqualTo(PizzaStatus.ORDERED);

Aquí, usamos una matriz devuelta por PizzaStatus.values ​​() para encontrar un valor coincidente basado en la propiedad timeToDelivery .

Sin embargo, este enfoque es bastante detallado. Además, también es ineficiente, ya que cada vez que queremos obtener el PizzaStatus correspondiente , debemos iterar sobre PizzaStatus.values ​​() .

2.1. Uso de Java 8 Stream

Veamos cómo podemos encontrar el PizzaStatus correspondiente utilizando el enfoque de Java 8:

int timeToDeliveryForOrderedPizzaStatus = 5; Optional pizzaStatus = Arrays.stream(PizzaStatus.values()) .filter(p -> p.getTimeToDelivery() == timeToDeliveryForOrderedPizzaStatus) .findFirst(); assertThat(pizzaStatus).hasValue(PizzaStatus.ORDERED);

Este código parece más conciso que el que usa el bucle for . Sin embargo, aún así, iteramos sobre PizzaStatus.values ​​() cada vez que necesitamos obtener una enumeración coincidente.

Además, tenga en cuenta que en este enfoque obtenemos la instancia Opcional en lugar de PizzaStatus directamente .

3. Usando el mapa

A continuación, usemos la estructura de datos Map de Java junto con el método de valores para obtener el valor de enumeración correspondiente al tiempo para entregar el valor entero.

En este enfoque, el método de valores se llama solo una vez al inicializar el mapa . Además, dado que estamos usando un mapa, no necesitamos iterar sobre los valores cada vez que necesitamos obtener el valor de enumeración correspondiente al tiempo de entrega.

Usamos un mapa estático timeToDeliveryToEnumValuesMapping internamente, que maneja el mapeo de tiempo para entregar a su valor de enumeración correspondiente.

Además, el método de valores de la clase Enum proporciona todos los valores de enumeración. En el bloque estático , iteramos sobre la matriz de valores de enumeración y los agregamos al mapa junto con el tiempo correspondiente para entregar un valor entero como clave:

private static Map timeToDeliveryToEnumValuesMapping = new HashMap(); static { for (PizzaStatus pizzaStatus : PizzaStatus.values()) { timeToDeliveryToEnumValuesMapping.put( pizzaStatus.getTimeToDelivery(), pizzaStatus ); } }

Finalmente, creamos un método estático que toma el entero timeToDelivery como parámetro. Este método devuelve el valor de enumeración correspondiente utilizando el mapa estático timeToDeliveryToEnumValuesMapping :

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

Al usar un mapa estático y un método estático, obtenemos el valor de enumeración correspondiente al tiempo para entregar el valor entero.

4. Conclusión

En conclusión, analizamos un par de soluciones alternativas para obtener valores de enumeración correspondientes al valor entero.

Como siempre, todos estos ejemplos de código están disponibles en GitHub.