Effective Java 学习笔记(15)

本文介绍了不可变类的概念及其设计原则。不可变类因其简单的状态机、线程安全性及易于维护等特点,在软件开发中占据重要地位。文章还讨论了如何确保类的不可变性,并提到了序列化过程中需要注意的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个不可改变(immutable)的类,顾名思义,就是其实例不能改变,即里面所有的信息在创建时就赋值,在其生命周期中其值不变。

使用不可改变的类的优点在于,设计简单,易于实现和使用,具体来讲,它的状态机很简单,只有一个状态。它是线程安全,能够自由的被共享,能够通过静态工厂模式尽可能复用已经创建出来的对象,也不用为它写clone或是拷贝构造函数,不可改变的类也便于维护,是系统的良性基石。

其唯一的缺点就是,它必须为不同的值分别创造不同的对象。

使一个类为immutable,要做到以下几点。

1.不要提供任何可以修改对象中数据的方法。

2.确保此类不会被继承。这个可以防止子类不小心对父类中的数据进行更改。

3.使所有的字段为final.

4.使所有的字段为private.

5.确保所有字段中的可被改变的对象的引用不被外界获得。

 

但要注意的当实现序列化的时候,如果一个不可改变类中包含可改变类的引用,就必须提供一个显式的readObject或readResolve,或使用ObjectOutputStream.writeUnshared和OjbectInputStream.readUnshared方法。否则就攻击者就可能创建一个可以改变的实例。

 

总结:除非有足够的理由,应该将类设计为immutable。

         如果一个类不能设计成immutable,那么尽量减少可改变的字段。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值