Item17:减小可变性

成为不可变类应该遵守的5条规则:
1.不要提供修改对象的方法,比如setter方法。
2.确保类不能被扩展。禁止类被子类化,通常使用final关键字
3.使所有域final
4.使所有域private,因为这样可以阻止客户端获取可变对象的引用,从而修改该域
5.如果类有可变对象域,要确保客户端无法获取这些可变域的引用,也不要提供方法返回该域的引用,在构造器或访问方法中使用保护性拷贝技术。
(可以参考下面链接中的内容,但是需要注意的是链接中的Date相关的方法已经废弃了)
https://blog.csdn.net/tounaobun/article/details/8607174

注意:
1.不可变对象本质上是线程安全的,所以不需要同步。不可变对象可以被共享。
2.不可变对象鼓励客户端对对象实例的重用。实现途径是提供public static final类型的常量。另一种办法是提供静态工厂方法来保存频繁使用的实例,从而避免实例的创建(可以减少内存占用和垃圾回收的成本)。所有的包装类就有这种方法。
3.不可变类的copy始终和原始类一样,因此不应该给不可变类提供clone方法或copy构造器。
4.为了确保不可变性,通常使用final避免类被子类化,还有一种更灵活的方法,即把类的所有构造器变成包级私有(即默认)或私有,并提供公有的静态工厂方法来替代构造器。这样做的好处是,这个类可以有多个包级私有实现类,同时对于客户端而言,该类仍然可以起到final的效果。
5.许多不可变类有一个或多个非final域,目的是在第一次执行计算的时候用于缓存值,后续相同的请求可以直接返回值,这也被叫做延迟初始化,比如String的hash属性

/** Cache the hash code for the string */
    private int hash; // Default to 0

6.警告:如果让不可变类实现Serializable接口,并且该不可变类包含可变域的话,必须提供一个显式的readObject或readResolve方法,或者使用ObjectOutputStream.writeUnshared和ObjectInputStream.readUnshared方法。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值