不可变类

阅读《Effictive Java》笔记
不可变类:其实例不可被修改 每个实例地信息都需要在创建地时候给出。不可变类有:String 基本类型地封装类、BIgInteger和BigDecimal
要使类成为不可变类需要遵循下面五条规则:

在这里插入图片描述

函数(functional)的做法:对操作数进行运算但并不修改它
对应 过程的(procedural)或者命令式的(imperative):将过程作用在操作数上,并且会改变他们的状态
不可变对象的优点:
1、简单,因为整个生命周期中不可能发生改变所有可以不需要做额外的工作来维护约束关系
2、本质上是线程安全的,不要求同步,可以自由得被共享
鼓励客户端尽可能得重用现有的实例,对于常用的值可以提供公有静态final(public static final)方法,进一步扩展后提供静态工厂把频繁请求的实例缓存起来(所有基本类型的包装类和BigInteger都有这样的方法:)

在这里插入图片描述

在这里插入图片描述

缺点是:每个不同的值都需要一个单独的对象

为了确保不可变性,不可变类不允许被子类化有两种方式:
1、用final修饰类
2、让所有构造器都变成私有的或者包级私有的,并添加静态工厂方法来替代公有的构造器(更加灵活)

当不可变类需要实现序列化时:
不可变类中包含了指向可变对象的域时,必须提供显示的readObject或者readResolve方法,或者ObjectOutPutStream.writeUnshared和 ObjectInputStream.readUnshared,否则攻击者可以通过不可变类穿件可变的实例(具体参考《Effictive java》第二版 76条)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值