不可变对象
不可变对象(Immutable Object):对象一旦被创建后,对象所有的状态及属性在其生命周期内不会发生任何变化。发布不可变对象是安全的。
自定义不可变类
通常来说,创建不可变类原则有以下几条:
所有成员变量必须是
private
,同时用final
修饰将类声明为
final
,不允许类被继承不提供能够修改原有对象状态的方法,最常见的方式是不提供
setter
方法通过构造器初始化所有成员变量,引用类型的成员变量必须进行深拷贝(deep copy)
在
get
方法中不直接返回对象的本身,而是克隆对象,返回对象的拷贝。
下面是一个Immutable Object的例子,该对象可以用在并发环境下而没有线程安全问题。
1 | final public class Person { |
Java unmodifiablexxx
使用Java的Collections
类的unmodifiablexxx
相关方法,可以创建不可变对象。xxx
方法包含:Collection、List、Map、Set….
1 | public class ImmutableExample { |
UnmodifiableMap
对map
的更新方法(比如put、remove等)进行了重写,均返回UnsupportedOperationException
异常,这样就做到了map
对象的不可变。
Guava Immutablexxx
使用Guava
的Immutablexxx
类也可以创建不可变对象。xxx
同样包含很多类型:Collection、List、Map、Set….
1 | private final static ImmutableMap<Integer, Integer> map = ImmutableMap.of(1, 2, 3, 4); |
Immutable
相关类使用了跟Java的unmodifiable
相关类相似的实现方法。