不变性
什么是不变性
- 如果对象被创建后,状态就不能被修改,那么它就是不可变的
- 具有不变性的对象一定是线程安全的,我们不需要对其采取任何例外的安全措施
final
- 类防止被继承、方法防止被重写、变量防止被修改
- 天生线程安全且不需要额外同步开销
三种用法
- 修饰变量
- 被修饰的变量意味着值不能被修改,如果变量是个对象,则只是引用不能变,但是内容可以变
- 属性被声明为final后,该变量则只能被赋值一次而且必须赋值,且一旦被赋值后,final的变量就不能被再改变
- 类中的final属性
- 第一种实在声明变量的等号右边直接赋值
- 第二种就是构造函数中赋值
- 第三种是在类的初始化代码块中赋值(不常用)
- 类中的static final属性
- 两个赋值时机:除了在声明变量等号右边直接赋值外,还可以使用static初始代码块赋值,但不能使用普通的初始代码块
- 方法中的final变量
- 由于变量在方法里,所以没有构造函数也不存在初始代码块
- 不要求赋值时期,但是使用前必须要赋值,和非final的变量要求一样
- 类中的final属性
- 修饰方法
- 不允许修饰构造方法
- 修饰的方法不能被重写但是可以重载
- 修饰类
- 不可被继承
不变性和final的关系
- 不变性并不意味着简单地用final修饰就不可变
- 对于基本数据类型,被final修饰后就有不变性
- 但是对象类型,要保证自身被创建后,状态永远不变才行
满足一下条件时,对象是不可变的
- 对象创建后,其状态不能修改
- 所有属性都被final修饰
- 对象创建过程中没有溢出







