目录
一、不可变对象
1. 不可变对象需要满足的条件:
- 对象创建以后其状态就不能修改;
- 对象所有的域都是final类型;
- 对象是正确创建的(在创建期间,this引用没有逸出)
2.具体来说可以通过以下策略来实现:
- 将类声明成final,那么该类就无法被继承了;
- 将所有的成员设置成
private
属性,使外界不能直接访问成员变量; - 设置成员变量不提供
setter()
方法,并将成员变量声明成final
属性,使成员变量只能被赋值一次; - 通过构造器初始化所有成员,进行深度拷贝;
- 在成员变量的
getter()
方法中,不直接返回变量本身,而是克隆对象,并返回对象得到拷贝;
不可变对象的实现可以参考String对象的实现;
二. final
实现不可变对象
1. final
的使用
final关键字主要用于修饰类、方法、变量:
- 修饰类:该类则无法被继承;
- 修饰方法:锁定方法不能被继承类修改;提高使用效率
- 修饰变量:
如果是修饰基本数据类型变量,那么一旦初始化后,该变量就不能被修改了;
如果是修饰引用类型变量,那么一旦初始化后,该变量就不能被指向另外的对象,但是依然可以修改该对象内部的值
如代码所示:
@Slf4j
public class ImmutableExample1 {
private final static Integer a=1;
private final static String b="2";
//线程不安全的map
private final static Map<Integer,Integer> map = Maps.newHashMap();
static {
map.put(1,2);
map.put(3,4);
map.put(5,6);
}
public static void main(String[] args) {
// a=2; //编译报错
// b=3; //编译报错
map.put(1,</