【问题标题】:Reusing static initialization block重用静态初始化块
【发布时间】:2014-06-30 22:19:32
【问题描述】:

我发现在 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);
}

现在,我有大约两打 Enum 类,我想为所有这些类添加一个自定义 valueOf ——有没有一种方法可以做到这一点,而无需将其复制粘贴到每个类型/文件中?

【问题讨论】:

    标签: java enums static-initialization


    【解决方案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.

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2011-01-26
        • 2011-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-12
        • 1970-01-01
        相关资源
        最近更新 更多