我发现在Enum中使用静态初始化块非常适合实现自定义valueOf函数,如here所述。
public static RandomEnum getEnum(String strVal) {
return strValMap.get(strVal);
}
private static final Map<String, RandomEnum> strValMap;
static {
final Map<String, RandomEnum> tmpMap = Maps.newHashMap();
for(final RandomEnum en : RandomEnum.values()) {
tmpMap.put(en.strVal, en);
}
strValMap = ImmutableMap.copyOf(tmpMap);
}
现在,我有大约24个Enum类,我想为所有这些类添加自定义valueOf - 有没有办法在不将其复制粘贴到每个类型/文件中的情况下执行此操作?
答案 0 :(得分:1)
创建一个私有静态函数,并在初始化块中多次使用它。您也可以将该函数的结果分配给地图,而不使用静态块:
private static <E extends Enum<E>> Map<String,E> makeValueMap(E[] values) {
final Map<String,E> tmpMap = new HashMap<String,E>();
for(final E en : values) {
tmpMap.put(en.name(), en);
}
return tmpMap;
}
现在你可以写
了private static final Map<String,RandomEnum> strValMap1 = makeValueMap(RandomEnum.values());
private static final Map<String,AnotherEnum> strValMap2 = makeValueMap(AnotherEnum.values());
private static final Map<String,YetAnotherEnum> strValMap3 = makeValueMap(YetAnotherEnum.values());
答案 1 :(得分:0)
要实现相同的机制 WITHIN 枚举类,我想不,因为枚举不能从类(仅接口)继承,因此无法共享实现。
但是,您可以实现一个独立的实用程序,它可以同时为所有不同的枚举类型执行此操作。该实用程序将通过枚举类型+ strVal查找枚举值。