使用唯一属性检索枚举值

时间:2014-10-02 21:43:06

标签: java map enums

是否可以创建泛型方法或类来从给定的唯一属性(带有getter方法的字段)中检索枚举值?

所以你会:

public enum EnumToMap {
    E1("key1"),
    E2("key2"),
    ;

    private final String key;

    private EnumToMap(String key) {
        this.key = key;
    }

    public String getKey() {
        return key;
    }
}

所需要的功能与

相同
public static EnumToMap getByKey(String key)
    ...

会提供。最好不要反射并尽可能通用(但在这种情况下,可能无法在没有反射的情况下创建通用解决方案)。

澄清:所以这个方法应该适用于多个枚举。这个想法不是必须反复实施查找。

2 个答案:

答案 0 :(得分:5)

实际上只能使用泛型和界面。

创建并实施界面

interface WithKeyEnum {
    String getKey();
}

enum EnumToMap implements WithKeyEnum {
    ...

    @Override
    public String getKey() {
        return key;
    }
}

<强>实施

public static <T extends Enum<T> & WithKeyEnum> T getByKey(Class<T> enumTypeClass, String key) {
    for (T type : enumTypeClass.getEnumConstants()) {
        if (type.getKey().equals(key)) {
            return type;
        }
    }
    throw new IllegalArgumentException();
}

<强>用法

EnumToMap instanceOfE1 = getByKey(EnumToMap.class, "key1");

答案 1 :(得分:0)

如果你想放弃泛化并获得O(1)复杂性,请使用HashMap来获取它

public enum EnumToMap{
    E1("key1"),
    E2("key2");

    private final String key;

    private static final Map<String, EnumToMap> keys = new HashMap<String, EnumToMap>();
    static {
        for (EnumToMap value : values()) {
            keys.put(value.getKey(), value);
        }
    }

    private EnumToMap(String key) {
        this.key = key;
    }

    public String getKey() {
        return key;
    }

    public static EnumToMap getByKey(String key) {
        return keys.get(key);
    }
}

由于必须是对象来存储地图,因此很难生成。 Enum本身似乎是很好的候选人。