起因:
今天在敲代码的时候有一个想法,初始化一个Map对象,存储小程序推送模板消息。本来是考虑使用enum枚举类,之后因为初始话map对象卡住了。去搜索了一下,发现ImmutableMap类的神奇之处,记录并学习一下。
1.什么是ImmutableMap对象
根据guava文档所描述的,ImmutableMap是一个不可变的Map对象,其构造器如下所示,用于创建不可变Map实例。
|
static class |
ImmutableMap.Builder<K,V>|
Guava提供了每个java.util的不可变版本。使用 ImmutableMap 映射 。每当我们尝试修改它时,它都会抛出 UnsupportedOperationException。
2.可以链式编程的Map
最开始对他感兴趣是因为他可以链式编程,显得很酷,根据代码提示写起来也很块,所以,进一步了解他。
Map<String, String> stringStringMap = ImmutableMap.<String,String>builder()
.put("page","page/page/index")
.put("templateId","")
.put("templateId","")
.put("formId","")
.build();
3.不可变的Map
为什么需要不可变的集合呢?
(1)保证线程安全:在并发程序中,使用Immutable既保证线程安全性,也大大增强了并发时的效率(跟并发锁方式相比)。尤其当一个对象是值对象时,更应该考虑采用Immutable方式;
(2)被不可信的类库使用时会很安全;
(3)如果一个对象不需要支持修改操作(mutation),将会节省空间和时间的开销;经过分析,所有不可变的集合实现都比可变集合更加有效地利用内存;
(4)可以当作一个常量来对待,并且这个对象在以后也不会被改变。
将一个对象复制一份成immutable的,是一个防御性编程技术。
为什么不可变?
源码中,在build()方法里,进行了判断,因为在builder()的时候size被初始化为4,所以这里直接就返回了一个不可变的集合。
而put方法,直接抛出异常,不可添加,其他方法相同。
不要以为每天把功能完成了就行了,这种思想是要不得的,互勉~!