一、存在的意义
1、让并发编程变得更简单
线程安全问题的根本原因在于:多个线程需要同时访问同一个共享资源。
假如没有共享资源,那么多线程安全问题就自然解决了,Java中ThreadLocal机制就是采取的这种思想。
2、消除副作用
防止在其他地方修改了对象属性,导致结果未按预期运行。(String设计成Final的原因之一)
3、减少容器类使用过程出错的概率
当使用HashSet时,如HashSet中存储对象属性可修改,会导致HashCode和修改前不一致,从而导致存的数据丢失
二、创建不可变对象条件
1、所有成员变量必须是private ,最好同时用final修饰(非必须)
2、不提供能够修改原有对象状态的方法
最常见的方式是不提供setter方法
如果提供修改方法,需要新创建一个对象,并在新创建的对象上进行修改
3、通过构造器初始化所有成员变量,引用类型的成员变量必须进行深拷贝(deep copy)
4、getter方法不能对外泄露this引用以及成员变量的引用
5、最好不允许类被继承(非必须)
不可变对象虽然具备不可变性,但是不是"完全不可变”的,通过反射等方式能修改对象的属性
参考:https://www.cnblogs.com/dolphin0520/p/10693891.html