Java中静态初始化EnumMap的最佳方式是什么?

8

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

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

还有其他更清洁、更高效的方式吗?


2
第二个是一个很大的反模式,而你的第一个没有初始化EnumMap,而是一个Map(不可变的)。 - Eugene
3个回答

14

一个整洁的设置EnumMap的方法是使用Map.ofMap.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 = yourMapMethod();

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

感谢分享这种方法。 - javaguy

2

在静态代码块中执行:

private static final EnumMap<....> yourMap = ...

static {
   yourMap.put(....);
   yourMap.put(....)
}

有一些不同的方法可以实现这个功能(但它们尚不存在于API中),通过Constant Dynamic


在静态块中执行的特定原因是什么? - sham
@sham how else? - Eugene
第一个看起来不错。使用静态块更好吗? - sham
谢谢,我得到了答案。 请注意,此Map.of方法仅支持最多10个键值对。 在您的文章中提到 - https://www.baeldung.com/java-initialize-hashmap - sham
是的,我同意...我在谈论的是Map.of,它可以存储最多10个映射,但这可以通过使用ofEntries来克服。 - sham
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接