什么是不变性(Immutable)
- 如果对象在被创建后,状态不能被修改,那么它就是不可变的。
- 对于不可变的对象(一个对象中所有的属性都被final修饰)是线程安全的,不需要采取额外的措施
fianl的作用
- 修饰类防止被继承
- 修饰方法防止被重写
- 修饰变量防止被修改
- 天生是线程安全而不需要额外的同步开销
final的3种用法
fianl修饰变量
被final修饰的变量,意味着值不能被修改,如果变量是对象那么对象的引用不能变但是自身的内容依然可以变化
赋值时机
如果初始化并不赋值,后续赋值,就是从null变成你的赋值,这就违反final不变的原则了
类中的变量
- 类中的 final变量
- 声明变量的等号右边直接赋值
- 构造函数中赋值
- 类的初始化代码块中赋值
类中的 static final 变量
- 声明变量的等号右边直接赋值
- static 初始化代码块赋值
方法中的 final 变量
- 不规定赋值时机,只要求在使用前赋值和方法中非final的变量是一样的。
final修饰方法
- 构造方法不允许fianl修饰
- final、static 修饰的方法不能被重写
final修饰的类
- 不可被继承
final注意点
- final修饰对象时,只是对象的引用不可变,而对象本身的属性是可以变化的
- fianl使用原则:良好的变成习惯
不变性和final的关系
不变性并不意味着,简单地用fianl修饰就是不可变
- 对于基本数据类型,确实被final修饰后具有不可变性
- 但是对于对象类型,需要该对象保证自身被创建后,状态永远不会变才可以
如何利用final实现对象不可变
- 对象创建后其状态不能被修改
- 所有属性都是final修饰的
- 对象在创建过程中没有发生逸出