是否可以创建泛型方法或类来从给定的唯一属性(带有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)
...
会提供。最好不要反射并尽可能通用(但在这种情况下,可能无法在没有反射的情况下创建通用解决方案)。
澄清:所以这个方法应该适用于多个枚举。这个想法不是必须反复实施查找。
答案 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本身似乎是很好的候选人。