final的不变性设计


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放到其他位置上。

JjJ4hj.png

线程安全,由于字符串的特点是公用的,因此在很多地方都会用到,因此采用final设计成为不可变的。


  TOC