什么是不变性

  • 如果对象被创建后,状态就不能被修改,那么它就是不可变的
  • 具有不变性的对象一定是线程安全的,我们不需要对其采取任何例外的安全措施

final

  • 类防止被继承、方法防止被重写、变量防止被修改
  • 天生线程安全且不需要额外同步开销
三种用法
  • 修饰变量
    • 被修饰的变量意味着值不能被修改,如果变量是个对象,则只是引用不能变,但是内容可以变
    • 属性被声明为final后,该变量则只能被赋值一次而且必须赋值,且一旦被赋值后,final的变量就不能被再改变
      • 类中的final属性
        • 第一种实在声明变量的等号右边直接赋值
        • 第二种就是构造函数中赋值
        • 第三种是在类的初始化代码块中赋值(不常用)
      • 类中的static final属性
        • 两个赋值时机:除了在声明变量等号右边直接赋值外,还可以使用static初始代码块赋值,但不能使用普通的初始代码块
      • 方法中的final变量
        • 由于变量在方法里,所以没有构造函数也不存在初始代码块
        • 不要求赋值时期,但是使用前必须要赋值,和非final的变量要求一样
  • 修饰方法
    • 不允许修饰构造方法
    • 修饰的方法不能被重写但是可以重载
  • 修饰类
    • 不可被继承

不变性和final的关系

  • 不变性并不意味着简单地用final修饰就不可变
    • 对于基本数据类型,被final修饰后就有不变性
    • 但是对象类型,要保证自身被创建后,状态永远不变才行
满足一下条件时,对象是不可变的
  • 对象创建后,其状态不能修改
  • 所有属性都被final修饰
  • 对象创建过程中没有溢出