使用 Guava 的 ImmutableMap 构建不可变的 Map

在实际开发中,我们往往需要定义和初始化一些常量 Map,普通的做法一般是在 static 代码块中初始化:

1
2
3
4
5
6
public static Map<String, Integer> STATIC_MAP = new HashMap<>();

static {
STATIC_MAP.put("A", 1);
STATIC_MAP.put("B", 2);
}

这种方式只是创建一个初始化好的 map,但这个 map 是有可能被别人修改的,达不到不可变的要求。

Guava 提供了 ImmutableMap 类用于创建不可变的 Map,用法如下:

1
2
3
4
public static final Map<String, Integer> STATIC_MAP = new ImmutableMap.Builder<String, Integer>()
.put("A", 1)
.put("B", 2)
.build();

它是不可变的,当我们调用 put 方法时,会抛出 UnsupportedOperationException 异常:

1
2
Exception in thread "main" java.lang.UnsupportedOperationException
at com.google.common.collect.ImmutableMap.put(ImmutableMap.java:495)

因为 ImmutableMap 重写了 Map 的 put 方法,直接抛异常:

1
2
3
4
5
6
@CanIgnoreReturnValue
@Deprecated
@Override
public final V put(K k, V v) {
throw new UnsupportedOperationException();
}

除了通过 build 方式创建,ImmutableMap 还提供了一些更方便的 api 创建 Map:

1
2
3
4
5
6
7
8
public static <K, V> ImmutableMap<K, V> of(K k1, V v1);
public static <K, V> ImmutableMap<K, V> of(K k1, V v1, K k2, V v2);
public static <K, V> ImmutableMap<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3);
public static <K, V> ImmutableMap<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4);
public static <K, V> ImmutableMap<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5);

// 示例
Map<String, Integer> STATIC_MAP = ImmutableMap.of("A", 1, "B", 2);

【附】Guava 的 Maven 依赖:

1
2
3
4
5
6
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>23.0</version>
</dependency>