Casting int en Enum en Java

1. Vue d'ensemble

Dans ce didacticiel, nous examinerons brièvement les différentes façons de convertir un int en une valeur enum en Java. Bien qu'il n'y ait pas de moyen direct de lancer, il existe plusieurs façons de l'approcher.

2. Utilisation des valeurs Enum #

Tout d' abord, le regard let comment nous pouvons résoudre ce problème en utilisant les Enum de valeurs méthode.

Commençons par créer une énumération PizzaStatus qui définit le statut d'une commande pour une 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. }

Nous associons chaque valeur d'énumération constante au champ timeToDelivery . Lors de la définition des énumérations constantes, nous transmettons le champ timeToDelivery au constructeur.

La méthode des valeurs statiques renvoie un tableau contenant toutes les valeurs de l'énumération dans l'ordre de leur déclaration. Par conséquent, nous pouvons utiliser la valeur entière timeToDelivery pour obtenir la valeur d'énumération correspondante:

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

Ici, nous utilisons un tableau retourné par PizzaStatus.values ​​() pour trouver une valeur correspondante basée sur la propriété timeToDelivery .

Cette approche, cependant, est assez verbeuse. De plus, c'est également inefficace car chaque fois que nous voulons récupérer le PizzaStatus correspondant , nous devons itérer sur PizzaStatus.values ​​() .

2.1. Utilisation de Java 8 Stream

Voyons comment nous pouvons trouver le PizzaStatus correspondant en utilisant l'approche Java 8:

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

Ce code semble plus concis que celui qui utilise la boucle for . Cependant, nous itérons toujours sur PizzaStatus.values ​​() chaque fois que nous avons besoin d'obtenir une énumération correspondante.

Notez également que dans cette approche, nous obtenons directement l'instance Facultatif au lieu de PizzaStatus .

3. Utilisation de la carte

Ensuite, utilisons la structure de données Map de Java avec la méthode values pour récupérer la valeur d'énumération correspondant à l'heure de livraison de la valeur entière.

Dans cette approche, la méthode values n'est appelée qu'une seule fois lors de l'initialisation de la carte . De plus, étant donné que nous utilisons une carte, nous n'avons pas besoin d'itérer les valeurs à chaque fois que nous devons récupérer la valeur enum correspondant à l'heure de livraison.

Nous utilisons une carte statique timeToDeliveryToEnumValuesMapping en interne, qui gère le mappage du temps à livrer à sa valeur d'énumération correspondante.

De plus, la méthode values de la classe Enum fournit toutes les valeurs enum. Dans le bloc statique , nous parcourons le tableau de valeurs d'énumération et les ajoutons à la carte avec l'heure correspondante pour fournir une valeur entière comme clé:

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

Enfin, nous créons une méthode statique qui prend l' entier timeToDelivery comme paramètre. Cette méthode renvoie la valeur d'énumération correspondante à l'aide de la carte statique timeToDeliveryToEnumValuesMapping :

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

En utilisant une carte statique et une méthode statique, nous récupérons la valeur d'énumération correspondant à l'heure de livraison de la valeur entière.

4. Conclusion

En conclusion, nous avons examiné quelques solutions de contournement pour récupérer les valeurs d'énumération correspondant à la valeur entière.

Comme toujours, tous ces exemples de code sont disponibles à l'adresse over sur GitHub.