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

    技术2022-07-10  94

    用私有的构造器或者枚举强化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最佳的方法。

    Processed: 0.009, SQL: 9