enum interface static method

http://stackoverflow.com/questions/10121988/enums-shared-static-look-up-method


This is a bit tricky because the values() method is static. You would actually need reflection, but there is a nice way to hide this using standard library functionality.

First, define an interface with the methods common to all of your enum types:

public interface Common {
    Integer getCode();
    String getDescription();
}

Then, make all your enums implement this interface:

public enum MyEnum implements Common {...}

The static method you want to have then looks like:

public static <T extends Enum<T> & Common> T getValueOf( Class<T> type, Integer code ) {
    final EnumSet<T> values = EnumSet.allOf( type );
    for(T e : values) {
        if(e.getCode().equals( code )) {
            return e;
        }
    }
    throw new IllegalArgumentException( "No enum const " + type.getName() + " for code \'" + code + "\'" );
}



or


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);