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?
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: