使用
ImmutableMap来自google guava的一个工具类,使用这个类,需先引入maven依赖
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>30.1.1-jre</version>
</dependency>
创建
Immutable,即不可变的,如果一个对象实例不能被更改就是一个Immutable的对象,适合永久性不会更改的配置。
//创建ImmutableMap:
Map<String,Object> immutableMap = new ImmutableMap.Builder<String,Object>().build();
//创建时放值
Map<String,Object> immutableMap = new ImmutableMap.Builder<String,Object>()
.put("name","123")
.put("work","code")
.build();
//ImmutableMap创建成功后不可被更改
immutableMap.put("name","456");//抛出java.lang.UnsupportedOperationException,也不可以再添加key值,且key值和value值均不能赋值为null,放入null值会抛出NullPointerException
ImmutableMap的优点
以用ImmutableMap.of(k1,v1,k2,v2)
直接添加键值对,不需要像map
一样还得一个一个put
进去,如果只用一次的话,可以直接用ImmutableMap.of(k1,v1,k2,v2)
当map参数传入方法中,省去新建map对象这一步。
ImmutableMap的缺点
of 方法入参最多只能有 5 对,如果添加的数据超过 5 对,需要改用builder方法。
//源码:
public abstract class ImmutableMap<K, V> implements Map<K, V>, Serializable{
......
public static <K, V> ImmutableMap<K, V> of(K k1, V v1) {
return new SingletonImmutableMap(Preconditions.checkNotNull(k1), Preconditions.checkNotNull(v1));
}
public static <K, V> ImmutableMap<K, V> of(K k1, V v1, K k2, V v2) {
return new RegularImmutableMap(new Entry[]{entryOf(k1, v1), entryOf(k2, v2)});
}
public static <K, V> ImmutableMap<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3) {
return new RegularImmutableMap(new Entry[]{entryOf(k1, v1), entryOf(k2, v2), entryOf(k3, 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) {
return new RegularImmutableMap(new Entry[]{entryOf(k1, v1), entryOf(k2, v2), entryOf(k3, v3), entryOf(k4, 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) {
return new RegularImmutableMap(new Entry[]{entryOf(k1, v1), entryOf(k2, v2), entryOf(k3, v3), entryOf(k4, v4), entryOf(k5, v5)});
}