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 pizzaOrderedStatus = null;
for (PizzaStatus pizzaStatus : PizzaStatus.values()) {
if (pizzaStatus.getTimeToDelivery() == timeToDeliveryForOrderedPizzaStatus) {
pizzaOrderedStatus = pizzaStatus;
}
}
assertThat(pizzaOrderedStatus).isEqualTo(PizzaStatus.ORDERED);
Here, we use an array returned by the PizzaStatus.values() to find a matching value based on the timeToDelivery property.
This approach, however, is quite verbose. Moreover, it’s also *inefficient as every time we want to fetch the corresponding PizzaStatus, we need to iterate over the PizzaStatus.values().*
2.1. Using Java 8 Stream
Let’s see how we can find the matching PizzaStatus using the Java 8 approach:
int timeToDeliveryForOrderedPizzaStatus = 5;
Optional<PizzaStatus> pizzaStatus = Arrays.stream(PizzaStatus.values())
.filter(p -> p.getTimeToDelivery() == timeToDeliveryForOrderedPizzaStatus)
.findFirst();
assertThat(pizzaStatus).hasValue(PizzaStatus.ORDERED);
This code looks more concise than the one which uses the for loop. However, still, we iterate over the PizzaStatus.values() every time we need to get a matching enum.
Also, note that in this approach we get the Optional
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 {
for (PizzaStatus pizzaStatus : PizzaStatus.values()) {
timeToDeliveryToEnumValuesMapping.put(
pizzaStatus.getTimeToDelivery(),
pizzaStatus
);
}
}
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.