Int naar Enum casten in Java

1. Overzicht

In deze tutorial kijken we kort naar de verschillende manieren om een int naar een opsommingswaarde in Java. Hoewel er geen directe manier is om te casten, zijn er een aantal manieren om het te benaderen.

2. Met behulp van Enum#waarden

Laten we eerst eens kijken hoe we dit probleem kunnen oplossen door de Enum‘S waarden methode.

Laten we beginnen met het maken van een opsomming PizzaStatus dat de status van een bestelling voor een pizza bepaalt:

openbare opsomming PizzaStatus {BESTELD (5), KLAAR (2), GELEVERD (0); privé int timeToDelivery; PizzaStatus (int timeToDelivery) {this.timeToDelivery = timeToDelivery; } // Methode die de variabele timeToDelivery ophaalt. }

We associëren elke constante opsommingswaarde met timeToDelivery veld. Bij het definiëren van de constante enums, passeren we de timeToDelivery veld naar de constructor.

De statisch waarden method geeft een array terug die alle waarden van de enum bevat in de volgorde van hun declaratie. Daarom kunnen we de timeToDelivery integerwaarde om de bijbehorende opsommingswaarde te krijgen:

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

Hier gebruiken we een array die wordt geretourneerd door de PizzaStatus.values ​​() om een ​​overeenkomende waarde te vinden op basis van de timeToDelivery eigendom.

Deze benadering is echter nogal uitgebreid. Bovendien is het ook inefficiënt omdat elke keer dat we het corresponderende willen ophalen PizzaStatus, moeten we de PizzaStatus.values ​​().

2.1. Java 8 gebruiken Stroom

Laten we eens kijken hoe we de overeenkomst kunnen vinden PizzaStatus met behulp van de Java 8-benadering:

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

Deze code ziet er beknopter uit dan degene die de voor lus. Toch herhalen we de PizzaStatus.values ​​() elke keer dat we een overeenkomende opsomming nodig hebben.

Merk ook op dat we bij deze benadering de Optioneel in plaats van de PizzaStatus instantie direct.

3. Met behulp van Kaart

Laten we vervolgens Java's gebruiken Kaart datastructuur samen met de waarden methode om de opsommingswaarde op te halen die overeenkomt met de tijd om de gehele waarde te leveren.

In deze benadering is het waarden methode wordt slechts één keer aangeroepen tijdens het initialiseren van de kaart. Bovendien, omdat we een kaart gebruiken, hoeven we de waarden niet elke keer te herhalen als we de enum-waarde moeten ophalen die overeenkomt met de tijd om te leveren.

We gebruiken een statische kaart timeToDeliveryToEnumValuesMapping intern, dat zorgt voor het in kaart brengen van de tijd die moet worden afgeleverd bij de bijbehorende opsommingswaarde.

Bovendien is de waarden methode van de Enum class biedt alle enum-waarden. In de statisch blok, herhalen we de array van opsommingswaarden en voegen ze samen met de bijbehorende tijd toe aan de kaart om de gehele waarde als sleutel te leveren:

privé statische kaart timeToDeliveryToEnumValuesMapping = nieuwe HashMap (); statisch {voor (PizzaStatus pizzaStatus: PizzaStatus.values ​​()) {timeToDeliveryToEnumValuesMapping.put (pizzaStatus.getTimeToDelivery (), pizzaStatus); }}

Ten slotte maken we een statisch methode die de timeToDelivery integer als parameter. Deze methode retourneert de overeenkomstige enum-waarde met behulp van de statische kaart timeToDeliveryToEnumValuesMapping:

openbare statische PizzaStatus castIntToEnum (int timeToDelivery) {return timeToDeliveryToEnumValuesMapping.get (timeToDelivery); }

Door een statische kaart en een statische methode te gebruiken, halen we de opsommingswaarde op die overeenkomt met de tijd om de gehele waarde te leveren.

4. Conclusie

Tot slot hebben we gekeken naar een aantal tijdelijke oplossingen om opsommingswaarden op te halen die overeenkomen met de gehele waarde.

Zoals altijd zijn al deze codevoorbeelden beschikbaar op GitHub.