【问题标题】:What is the best way to statically initialize an EnumMap in Java在 Java 中静态初始化 EnumMap 的最佳方法是什么
【发布时间】:2021-05-19 16:41:58
【问题描述】:

我需要静态初始化一个 EnumMap。我知道两种方法。

  1. Map的of()方法的使用
private static final Map<<EnumKey>, <Value>> TEST_MAP = Map.of(ENUM_CONST1, "Value1", ENUM_CONST2, "Value2");
  1. 使用双括号初始化
private static final Map<<EnumKey>, <Value>> TEST_MAP = new EnumMap<>(EnumKey.class) {
    {
        put(ENUM_CONST1, "Value1");
        put(ENUM_CONST2, "Value2");
     }
};

有没有其他更清洁、更高效的方法?

【问题讨论】:

  • 第二个是一个很大的反模式,你的第一个没有初始化EnumMap,而是一个Map(不可变的)

标签: java enums static enum-map


【解决方案1】:

设置 EnumMap 的一种巧妙方法是使用 Map.of 或 Map.ofEntries 在线定义所有值,但请注意,这会在 EnumMap 构造函数之前分配一个 Map:

private static final EnumMap<YourEnum,String> A = new EnumMap<>(Map.of(
        YourEnum.ONE, "Value1",
        YourEnum.TWO, "Value2"
));

// Use Map.ofEntries for enums with more than 10 values:
private static final EnumMap<YourEnum,String> B = new EnumMap<>(Map.ofEntries(
        Map.entry(YourEnum.ONE, "Value1"),
        Map.entry(YourEnum.TWO, "Value2")
));

如果想要公共访问,则包装为不可修改的 Map(由 EnumMap 支持)或直接传回 Map.of(但不使用 EnumMap)。

public static final Map<YourEnum,String> C = Collections.unmodifiableMap(B);

【讨论】:

    【解决方案2】:

    在静态块中执行:

    private static final EnumMap<....> yourMap = ...
    
    static {
       yourMap.put(....);
       yourMap.put(....)
    }
    

    将通过Constant Dynamic 以不同的方式执行此操作(但 API 中尚不存在)。

    【讨论】:

    • 在静态块中这样做的任何具体原因?
    • @sham 还有什么办法?
    • 第一个看起来也不错。用静态块更好吗
    • 谢谢你的回答。 “请注意,这个 Map.of 方法最多只支持 10 个键值对。”在你的文章中提到它 - baeldung.com/java-initialize-hashmap
    • 是的,同意...我说的是Map.of,它可以存储最多 10 个映射,而 ofEntries 克服了这一问题
    【解决方案3】:

    用方法来做:

    private static final EnumMap<....> yourMap = yourMapMethod();
    
    private static EnumMap<....> yourMapMethod() {
       EnumMap<....> yourMap = ...
       yourMap.put(....);
       yourMap.put(....);
       return yourMap;
    }
    

    【讨论】:

    • 感谢分享这种方法。
    猜你喜欢
    • 2014-12-11
    • 1970-01-01
    • 2010-09-17
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-01
    • 2012-01-28
    相关资源
    最近更新 更多