final关键字和不变性

本文详细探讨了不可变对象的概念,如何通过final关键字实现对象状态的保护,并强调了final在类、变量和方法中的不同用法。讲解了final与不变性的区别,以及如何利用final确保对象创建后的状态不变,提升线程安全性。
摘要由CSDN通过智能技术生成

什么是不变性(Immutable)

  • 如果对象在被创建后,状态不能被修改,那么它就是不可变的。
  • 对于不可变的对象(一个对象中所有的属性都被final修饰)是线程安全的,不需要采取额外的措施

fianl的作用

  • 修饰类防止被继承
  • 修饰方法防止被重写
  • 修饰变量防止被修改
  • 天生是线程安全而不需要额外的同步开销

final的3种用法

fianl修饰变量

被final修饰的变量,意味着值不能被修改,如果变量是对象那么对象的引用不能变但是自身的内容依然可以变化

赋值时机

如果初始化并不赋值,后续赋值,就是从null变成你的赋值,这就违反final不变的原则了

类中的变量

  • 类中的 final变量
  •  声明变量的等号右边直接赋值
  • 构造函数中赋值
  • 类的初始化代码块中赋值

类中的 static final 变量

  •  声明变量的等号右边直接赋值
  • static 初始化代码块赋值

 

方法中的 final 变量

  • 不规定赋值时机,只要求在使用前赋值和方法中非final的变量是一样的。

final修饰方法

  • 构造方法不允许fianl修饰
  • final、static 修饰的方法不能被重写

final修饰的类

  • 不可被继承

final注意点

  1. final修饰对象时,只是对象的引用不可变,而对象本身的属性是可以变化的
  2. fianl使用原则:良好的变成习惯

不变性和final的关系

不变性并不意味着,简单地用fianl修饰就是不可变

  • 对于基本数据类型,确实被final修饰后具有不可变性
  • 但是对于对象类型,需要该对象保证自身被创建后,状态永远不会变才可以

如何利用final实现对象不可变

  • 对象创建后其状态不能被修改
  • 所有属性都是final修饰的
  • 对象在创建过程中没有发生逸出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值