final的不变性设计
final的作用
final是用来修饰对象之间不变特性关系的,表示一种不可改变的关系。可以用来修饰变量、方法、类
修饰变量
fianl修饰变量表示一旦赋值关系,那么初始化后这种关系就不能被修改了;final只会保证这个变量的引用不可变,而对象本身的内容依然是可变的。
这样设计的目的是:
- 设计的角度
是对于不能修改变量的值需要进行final进行修饰
- 线程的角度
final修饰的变量在语意就是不变的,因此就是天生线程安全的
空白final
空白final将对final的赋值延迟了,从而增加了程序的灵活性
final修饰方法
final修饰方法表示方法不能被继承,其中构造方法不能被final修饰
final修饰类
final修饰类表示这个类不能被继承,在使用final时,一定要写为什么该类一定要被final进行修饰的原因。
string为什么被设计成final类型的?
如何实现的?
public final class String{
@Stable
private final byte[] value;
}
通过final修饰类和final修饰byte[] 来保证的
final带来的好处?
由于字符串在程序中是最常出现的,因此在jvm的规范中划定来一片区域作为字符串缓冲区常量池,也是由于这个特点,在字符串缓冲区内的引用关系被设计成不可变的。
可以优先作为Map的key进行使用,因为map的key需要进行hash运算,如果可变就会导致将value放到其他位置上。
线程安全,由于字符串的特点是公用的,因此在很多地方都会用到,因此采用final设计成为不可变的。