Casting int til Enum i Java

1. Oversigt

I denne vejledning ser vi kort på de forskellige måder at caste en int til en enum-værdi i Java. Selvom der ikke er nogen direkte måde at støbe på, er der et par måder at tilnærme det på.

2. Brug Enum#værdier

Lad os først se på, hvordan vi kan løse dette problem ved hjælp af Enum'S værdier metode.

Lad os starte med at oprette en enum PizzaStatus der definerer status for en ordre på en pizza:

offentlig enum PizzaStatus {BESTILT (5), KLAR (2), LEVERET (0); privat int timeToDelivery; PizzaStatus (int timeToDelivery) {this.timeToDelivery = timeToDelivery; } // Metode, der får variablen timeToDelivery. }

Vi forbinder hver konstant enumværdi med timeToDelivery Mark. Når vi definerer de konstante enums, passerer vi timeToDelivery felt til konstruktøren.

Det statisk værdier metoden returnerer en matrix, der indeholder alle værdierne i enum i rækkefølgen af ​​deres erklæring. Derfor kan vi bruge timeToDelivery heltal for at få den tilsvarende enumværdi:

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

Her bruger vi en matrix returneret af PizzaStatus.values ​​() for at finde en matchende værdi baseret på timeToDelivery ejendom.

Denne tilgang er imidlertid ret detaljeret. Desuden er det også ineffektiv som hver gang vi vil hente det tilsvarende PizzaStatus, er vi nødt til at gentage over PizzaStatus.values ​​().

2.1. Brug af Java 8 Strøm

Lad os se, hvordan vi kan finde matchningen PizzaStatus ved hjælp af Java 8 tilgang:

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

Denne kode ser mere kortfattet ud end den, der bruger til løkke. Imidlertid gentager vi stadig over PizzaStatus.values ​​() hver gang vi har brug for at få et matchende enum.

Bemærk også, at i denne tilgang får vi Valgfri i stedet for PizzaStatus eksempel direkte.

3. Brug Kort

Lad os derefter bruge Java'er Kort datastruktur sammen med værdier metode til at hente enumværdien svarende til tidspunktet for levering af heltal.

I denne tilgang er den værdier metode kaldes kun én gang, mens kortet initialiseres. Da vi bruger et kort, behøver vi desuden ikke at gentage værdierne hver gang vi skal hente enumværdien svarende til leveringstidspunktet.

Vi bruger et statisk kort timeToDeliveryToEnumValuesMapping internt, som håndterer kortlægningen af ​​tid til at levere til den tilsvarende enumværdi.

Desuden er den værdier metode til Enum klasse indeholder alle enumværdier. I statisk blokere, gentager vi over matrixen af ​​enumværdier og føjer dem til kortet sammen med den tilsvarende tid til at levere heltalværdi som nøgle:

privat statisk kort timeToDeliveryToEnumValuesMapping = ny HashMap (); statisk {for (PizzaStatus pizzaStatus: PizzaStatus.values ​​()) {timeToDeliveryToEnumValuesMapping.put (pizzaStatus.getTimeToDelivery (), pizzaStatus); }}

Endelig opretter vi en statisk metode, der tager timeToDelivery heltal som parameter. Denne metode returnerer den tilsvarende enumværdi ved hjælp af det statiske kort timeToDeliveryToEnumValuesMapping:

offentlig statisk PizzaStatus castIntToEnum (int timeToDelivery) {return timeToDeliveryToEnumValuesMapping.get (timeToDelivery); }

Ved at bruge et statisk kort og en statisk metode henter vi enumværdien svarende til tidspunktet for levering af heltal.

4. Konklusion

Afslutningsvis så vi på et par løsninger til at hente enumværdier svarende til heltalets værdi.

Som altid er alle disse kodeeksempler tilgængelige på GitHub.