Casting von int in Enum in Java

1. Übersicht

In diesem Tutorial werden wir uns kurz mit den verschiedenen Möglichkeiten befassen, ein int in einen Enum-Wert in Java umzuwandeln. Obwohl es keine direkte Möglichkeit zum Casting gibt, gibt es einige Möglichkeiten, dies zu approximieren.

2. Verwenden von Enum # -Werten

Zunächst schauen wir uns an , wie wir dieses Problem lösen können durch die Verwendung von Enum ‚s Werte Methode.

Beginnen wir mit der Erstellung einer Aufzählung PizzaStatus , die den Status einer Bestellung für eine Pizza definiert:

public enum PizzaStatus { ORDERED(5), READY(2), DELIVERED(0); private int timeToDelivery; PizzaStatus (int timeToDelivery) { this.timeToDelivery = timeToDelivery; } // Method that gets the timeToDelivery variable. }

Wir verknüpfen jeden konstanten Aufzählungswert mit dem Feld timeToDelivery . Bei der Definition der konstanten Aufzählungen übergeben wir das Feld timeToDelivery an den Konstruktor.

Die Methode für statische Werte gibt ein Array zurück, das alle Werte der Aufzählung in der Reihenfolge ihrer Deklaration enthält. Daher können wir den ganzzahligen Wert timeToDelivery verwenden, um den entsprechenden Aufzählungswert zu erhalten:

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

Hier verwenden wir ein Array, das von PizzaStatus.values ​​() zurückgegeben wird , um einen passenden Wert basierend auf der timeToDelivery- Eigenschaft zu finden.

Dieser Ansatz ist jedoch ziemlich ausführlich. Darüber hinaus ist es auch ineffizient, da wir jedes Mal, wenn wir den entsprechenden PizzaStatus abrufen möchten , die PizzaStatus.values ​​() durchlaufen müssen .

2.1. Verwenden von Java 8 Stream

Mal sehen, wie wir den passenden PizzaStatus mit dem Java 8-Ansatz finden können:

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

Dieser Code sieht prägnanter aus als der, der die for- Schleife verwendet. Trotzdem iterieren wir jedes Mal über PizzaStatus.values ​​(), wenn wir eine passende Aufzählung benötigen.

Beachten Sie außerdem, dass bei diesem Ansatz die Option Optional anstelle der Instanz PizzaStatus direkt abgerufen wird .

3. Verwenden der Karte

Als Nächstes verwenden wir die Map- Datenstruktur von Java zusammen mit der Methode values , um den Aufzählungswert abzurufen, der der Zeit für die Übermittlung eines ganzzahligen Werts entspricht.

Bei diesem Ansatz wird die Wertemethode beim Initialisieren der Karte nur einmal aufgerufen . Da wir eine Karte verwenden, müssen wir die Werte nicht jedes Mal durchlaufen, wenn wir den Enum-Wert abrufen müssen, der der zu liefernden Zeit entspricht.

Wir verwenden intern eine statische Zuordnung timeToDeliveryToEnumValuesMapping , die die Zuordnung der Zeit für die Übermittlung an den entsprechenden Aufzählungswert übernimmt.

Darüber hinaus liefert die Methode values der Enum- Klasse alle Enum-Werte. Im statischen Block durchlaufen wir das Array der Aufzählungswerte und fügen sie der Karte zusammen mit der entsprechenden Zeit hinzu, um einen ganzzahligen Wert als Schlüssel zu liefern:

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

Schließlich erstellen wir eine statische Methode, die die Ganzzahl timeToDelivery als Parameter verwendet. Diese Methode gibt den entsprechenden Aufzählungswert mithilfe der statischen Zuordnung timeToDeliveryToEnumValuesMapping zurück :

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

Mithilfe einer statischen Zuordnung und einer statischen Methode rufen wir den Aufzählungswert ab, der der Zeit entspricht, um einen ganzzahligen Wert zu liefern.

4. Fazit

Abschließend haben wir uns einige Problemumgehungen angesehen, um Aufzählungswerte abzurufen, die dem ganzzahligen Wert entsprechen.

Wie immer sind alle diese Codebeispiele auf GitHub verfügbar.