重用静态初始化块

时间:2014-06-30 22:19:32

标签: java enums static-initialization

我发现在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 - 有没有办法在不将其复制粘贴到每个类型/文件中的情况下执行此操作?

2 个答案:

答案 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());

Demo on ideone.

答案 1 :(得分:0)

要实现相同的机制 WITHIN 枚举类,我想不,因为枚举不能从类(仅接口)继承,因此无法共享实现。

但是,您可以实现一个独立的实用程序,它可以同时为所有不同的枚举类型执行此操作。该实用程序将通过枚举类型+ strVal查找枚举值。