Casting int a Enum in Java

1. Panoramica

In questo tutorial, esamineremo brevemente i diversi modi di trasmettere un int a un valore enum in Java. Sebbene non esista un modo diretto per eseguire il casting, ci sono un paio di modi per approssimarlo.

2. Utilizzo dei valori Enum #

In primo luogo, Diamo un'occhiata a come possiamo risolvere questo problema utilizzando l'Enum 's valori metodo.

Cominciamo creando un enum PizzaStatus che definisce lo stato di un ordine per una 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. }

Associamo ogni valore enum costante al campo timeToDelivery . Quando si definiscono le enumerazioni costanti, si passa il campo timeToDelivery al costruttore.

Il metodo dei valori statici restituisce un array contenente tutti i valori dell'enumerazione nell'ordine della loro dichiarazione. Pertanto, possiamo utilizzare il valore intero timeToDelivery per ottenere il valore enum corrispondente:

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

Qui, usiamo un array restituito da PizzaStatus.values ​​() per trovare un valore corrispondente in base alla proprietà timeToDelivery .

Questo approccio, tuttavia, è piuttosto prolisso. Inoltre, è anche inefficiente poiché ogni volta che vogliamo recuperare il corrispondente PizzaStatus , dobbiamo iterare su PizzaStatus.values ​​() .

2.1. Utilizzo di Java 8 Stream

Vediamo come possiamo trovare il PizzaStatus corrispondente utilizzando l'approccio Java 8:

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

Questo codice sembra più conciso di quello che usa il ciclo for . Tuttavia, ancora, iteriamo su PizzaStatus.values ​​() ogni volta che abbiamo bisogno di ottenere un'enumerazione corrispondente.

Inoltre, tieni presente che in questo approccio otteniamo direttamente l'istanza opzionale invece dell'istanza PizzaStatus .

3. Utilizzo della mappa

Successivamente, utilizziamo la struttura dati Map di Java insieme al metodo dei valori per recuperare il valore enum corrispondente al tempo per fornire il valore intero.

In questo approccio, il metodo dei valori viene chiamato solo una volta durante l'inizializzazione della mappa . Inoltre, poiché stiamo utilizzando una mappa, non è necessario iterare sui valori ogni volta che è necessario recuperare il valore enum corrispondente al tempo di consegna.

Usiamo internamente una mappa statica timeToDeliveryToEnumValuesMapping , che gestisce la mappatura del tempo da consegnare al valore enum corrispondente.

Inoltre, il metodo values della classe Enum fornisce tutti i valori enum. Nel blocco statico , iteriamo sull'array di valori enum e li aggiungiamo alla mappa insieme al tempo corrispondente per fornire il valore intero come chiave:

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

Infine, creiamo un metodo statico che prende il numero intero timeToDelivery come parametro. Questo metodo restituisce il valore enum corrispondente utilizzando la mappa statica timeToDeliveryToEnumValuesMapping :

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

Utilizzando una mappa statica e un metodo statico, recuperiamo il valore enum corrispondente al tempo per fornire il valore intero.

4. Conclusione

In conclusione, abbiamo esaminato un paio di soluzioni alternative per recuperare i valori enum corrispondenti al valore intero.

Come sempre, tutti questi esempi di codice sono disponibili su GitHub.