Enums shared static look-up method
enums, java
Solution
You need to pass the actual enum class object as a parameter to your method. Then you can get the enum values using `Class.getEnumConstants()`.
In order to be able to access `getCode()` on the instances, you should define it in an interface and make all your enum types implement that interface:
interface Encodable {
Integer getCode();
}
public static <T extends Enum<T> & Encodable> T getValueOf(Class<T> enumClass, Integer code) {
for (T e : enumClass.getEnumConstants()) {
if (e.getCode().equals(code)) {
return e;
}
}
throw new IllegalArgumentException("No enum const " + enumClass.getName() + " for code \'" + code
+ "\'");
}
...
public enum MyEnum implements Encodable {
...
}
MyEnum e = getValueOf(MyEnum.class, 10);
Problem
I have the following Enum: ``` public enum MyEnum{ A(10, "First"), // B(20, "Second"), // C(35, "Other options"); private Integer code; private String description; private MyEnum(Integer code, String description) { this.code = code; this.description = description; } public Integer getCode() { return code; } public String getDescription() { return description; } public static MyEnum getValueOf(Integer code) { for (MyEnum e : MyEnum.values()) { if (e.getCode().equals(code)) { return e; } } throw new IllegalArgumentException("No enum const " + MyEnum.class.getName() + " for code \'" + code + "\'"); } } ``` Which works fine. The `getValueOf`-method exists because when communicating with an external partner, we only get the code (they chose) to map to. I need the description because I need to show a meaningfull phrase in the GUI. But I now have a number of similar enum classes. All having their own code & description, and they need the same lookup functionality. I wanted the `getValueOf`-method to be generic so I don't need to support 30+ different enums for basically the same method. To solve this I wanted to make an abstract class to define this method and implement some of the common logic but this is impossible because I can't extend `Enum`. Then I tried to make a Utility class with the following method: ``` public static <T extends Enum<T>> T getValueOf(Enum<T> type, Integer code) {...} ``` But generics with Enums are confusing and I don't understand how to get this working. Basically what I want to know is: What is a good approach to define a common utility to an enum?