《EffectiveJava》读后感(第2章创建和销毁对象 第3条)

用私有的构造器或者枚举强化Singleton属性

Singleton想必大家都是很熟悉的一个设计模式了,这个实际模式也是在实际开发中相当好上手且实际优化效果佳的设计模式。Singleton指仅仅实例化一次的类。Singleton通常被用来代表那些本质上唯一的系统组件,比如窗口管理器或者文件系统。使类成为Singleton会使它的客户端测试变得十分困难,因为无法给Singleton替换模拟实现,除非它实现一个充当其类型的接口。

这里提供几个单例的实现模式:
1、普通单例。这个单例最简单,但是会存在一系列的问题,最简单的就是并发问题。
在这里插入图片描述
2、双重检索模式,解决并发问题,但这里设计到一个jvm的一个重排序的问题,需要在单例对象上加一个关键字volatile去解决这个重排序的问题(volatile这设计到jvm也是一个面试和编程容易遇到的一个问题,有兴趣的同学可以搜索相关博客进行学习)。
在这里插入图片描述
3、双重检索并在实例上添加volatile关键字,这个时候已经可以承受企业级的开发并不会出现任何问题,但极端情况下可以破解,比如反射机制。
在这里插入图片描述
4、静态内部内实现的单例模式,这个时线程安全且相对代码简单与第三条解决同级。
在这里插入图片描述
5、枚举实现的单例,这是本书作者推荐的模式,代码也很简单,不能通过反射机制搞到事情的单例模式。前面的单例都不能解决Singleton变成可序列化的问题,普通单例仅仅时加上序列化标签时不够的“implement Serializable”是不够的,为了维护并保证Singleton,必须申明实例域是(transient)的,并提供一个readResolve方法,否则每次反序列化的时候就会重新创建一个新的实例。

//Enum Singleton
public enum  EnumSingleton {
    INSTANCE;
    public EnumSingleton getInstance(){
        return INSTANCE;
    }
}

最后枚举实现的单例很多博客都在写是最好的单例,到底是为什么呢。更加简洁,无偿的提供了序列化机制,绝对防止多次实例化,即使面对复杂的序列化或者反射机制的时候最后作者写出,这是单元素的枚举类型是实现Singleton最佳的方法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值