Quantcast
Channel: Baeldung
Viewing all articles
Browse latest Browse all 4535

Casting int to Enum in Java

$
0
0

1. Overview

In this tutorial, we'll look briefly at the different ways of casting an int to an enum value in Java. Although there's no direct way of casting, there are a couple of ways to approximate it.

2. Using Enum#values

Firstly, let's look at how we can solve this problem by using the Enum‘s values method.

Let's start by creating an enum PizzaStatus that defines the status of an order for a 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.
}

We associate each constant enum value with timeToDelivery field. When defining the constant enums, we pass the timeToDelivery field to the constructor.

The static values method returns an array containing all of the values of the enum in the order of their declaration. Therefore, we can use the timeToDelivery integer value to get the corresponding enum value:

int timeToDeliveryForOrderedPizzaStatus = 5;
PizzaStatus[] pizzaStatuses = PizzaStatus.values();
PizzaStatus pizzaOrderedStatus = null;
for(int pizzaStatusIndex = 0; pizzaStatusIndex < pizzaStatuses.length; pizzaStatusIndex++) {
    if(pizzaStatuses[pizzaStatusIndex].getTimeToDelivery() == timeToDeliveryForOrderedPizzaStatus) {
        pizzaOrderedStatus = pizzaStatuses[pizzaStatusIndex];
    }
}
assertEquals(pizzaOrderedStatus, PizzaStatus.ORDERED);

First, we use the values method to get an array containing enum values.

Second, we iterate over the pizzaStatuses array and match timeToDelivery corresponding to it. If the timeToDelivery matches the timeToDeliveryForOrderedPizzaStatus value, then we return the corresponding PizzaStatus enum value.

In this approach, we call the values method every time we want to fetch the corresponding enum value using the time to deliver integer value. The values method returns an array of all the values of enum each time a call to values method is made.

Moreover, we iterate over the pizzaStatuses array fetched from the call to the values method each time to fetch the corresponding enum value; it's quite inefficient.

3. Using Map

Next, let's use Java's Map data structure along with the values method to fetch the enum value corresponding to the time to deliver integer value.

In this approach, the values method is called only once while initializing the map. Furthermore, since we're using a map, we don't need to iterate over the values each time we need to fetch the enum value corresponding to the time to deliver.

We use a static map timeToDeliveryToEnumValuesMapping internally, which handles the mapping of time to deliver to its corresponding enum value.

Furthermore, the values method of the Enum class provides all the enum values. In the static block, we iterate over the array of enum values and add them to the map along with the corresponding time to deliver integer value as key:

private static Map<Integer, PizzaStatus> timeToDeliveryToEnumValuesMapping = new HashMap<>();
static {
    PizzaStatus[] pizzaStatuses = PizzaStatus.values();
    for(int pizzaStatusIndex = 0; pizzaStatusIndex < pizzaStatuses.length; pizzaStatusIndex++) {
        timeToDeliveryToEnumValuesMapping.put(
            pizzaStatuses[pizzaStatusIndex].getTimeToDelivery(), 
            pizzaStatuses[pizzaStatusIndex]
        );
    }
}

Finally, we create a static method that takes the timeToDelivery integer as a parameter. This method returns the corresponding enum value using the static map timeToDeliveryToEnumValuesMapping:

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

By using a static map and static method, we fetch the enum value corresponding to the time to deliver integer value.

4. Conclusion

In conclusion, we looked at a couple of workarounds to fetch enum values corresponding to the integer value.

As always, all these code samples are available over on GitHub.


Viewing all articles
Browse latest Browse all 4535

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>