Lijevanje int u Enum na Javi

1. Pregled

U ovom uputstvu ukratko ćemo pogledati različite načine emitiranja int na enum vrijednost u Javi. Iako ne postoji izravan način emitiranja, postoji nekoliko načina za njegovo približavanje.

2. Korištenje Enum#vrijednosti

Prvo, pogledajmo kako možemo riješiti ovaj problem pomoću Enum‘S vrijednosti metoda.

Krenimo od stvaranja nabrajanja PizzaStatus koji definira status narudžbe za pizzu:

javni popis PizzaStatus {NARUČENO (5), SPREMNO (2), DOSTAVLJENO (0); privatni int timeToDelivery; PizzaStatus (int timeToDelivery) {this.timeToDelivery = timeToDelivery; } // Metoda koja dobiva varijablu timeToDelivery. }

Svaku konstantnu vrijednost nabrajanja povezujemo s timeToDelivery polje. Kada definiramo konstantne enume, prolazimo kroz timeToDelivery polje prema konstruktoru.

The statički vrijednosti metoda vraća niz koji sadrži sve vrijednosti nabrajanja po redoslijedu njihove deklaracije. Stoga možemo koristiti timeToDelivery cijela vrijednost za dobivanje odgovarajuće vrijednosti nabrajanja:

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

Ovdje koristimo niz koji je vratio PizzaStatus.values ​​() pronaći odgovarajuću vrijednost na temelju timeToDelivery imovine.

Ovaj je pristup, međutim, prilično opširan. Štoviše, također je neučinkovit kao i svaki put kad želimo dohvatiti odgovarajuće PizzaStatus, moramo prelistati PizzaStatus.values ​​().

2.1. Korištenje Jave 8 Stream

Pogledajmo kako možemo pronaći podudaranje PizzaStatus koristeći pristup Java 8:

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

Ovaj kôd izgleda sažetije od onoga koji koristi za petlja. Međutim, ipak ponavljamo PizzaStatus.values ​​() svaki put kad trebamo dobiti odgovarajući nabroj.

Također, imajte na umu da u ovom pristupu dobivamo Neobvezno umjesto PizzaStatus primjer izravno.

3. Korištenje Karta

Dalje, poslužimo se Java-ima Karta struktura podataka zajedno s vrijednosti metoda za dohvaćanje vrijednosti nabrajanja koja odgovara vremenu za isporuku cijele vrijednosti.

U ovom pristupu, vrijednosti metoda se poziva samo jednom tijekom inicijalizacije karte. Nadalje, budući da koristimo mapu, ne trebamo prelaziti preko vrijednosti svaki put kada moramo dohvatiti vrijednost nabrajanja koja odgovara vremenu za isporuku.

Koristimo statičku kartu mapiranje vremenaToDeliveryToEnumValues interno, koji obrađuje mapiranje vremena za isporuku do odgovarajuće vrijednosti nabrajanja.

Nadalje, vrijednosti metoda Enum klasa pruža sve vrijednosti nabrajanja. U statički blok, prevlačimo se preko niza vrijednosti nabrajanja i dodajemo ih na mapu zajedno s pripadajućim vremenom kako bismo isporučili cijelu vrijednost kao ključ:

privatna statička karta timeToDeliveryToEnumValuesMapping = nova HashMap (); static {for (PizzaStatus pizzaStatus: PizzaStatus.values ​​()) {timeToDeliveryToEnumValuesMapping.put (pizzaStatus.getTimeToDelivery (), pizzaStatus); }}

Konačno, kreiramo statički metoda koja uzima timeToDelivery cijeli broj kao parametar. Ova metoda vraća odgovarajuću vrijednost nabrajanja pomoću statičke mape mapToToDeliveryToEnumValuesMapping:

javni statični PizzaStatus castIntToEnum (int timeToDelivery) {return timeToDeliveryToEnumValuesMapping.get (timeToDelivery); }

Korištenjem statičke mape i statičke metode dohvaćamo vrijednost nabrajanja koja odgovara vremenu za isporuku cijele vrijednosti.

4. Zaključak

U zaključku smo pogledali nekoliko zaobilaznih rješenja za dohvaćanje vrijednosti popisa koji odgovaraju cjelobrojnoj vrijednosti.

Kao i uvijek, svi su ovi uzorci koda dostupni na GitHub-u.


$config[zx-auto] not found$config[zx-overlay] not found