effectiveJava强化Singleton属性

Posted Mr_邓

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了effectiveJava强化Singleton属性相关的知识,希望对你有一定的参考价值。

  使类成为singleton会使它的客户端测试变得十分困难,因为无法给Singleton替换模拟实现,除非它实现一个充当其类型的接口。

  在java1.5之前,有两种方法实现Singleton。两种方法都是要把构造器保持为私有的,并导出公有的静态成员,以便允许客户端能够访问该类的唯一实例。在单线程的条件下运行。

  方法一:公有域方法,优势:组成类的成员的声明很清楚地表明了这个类是一个Singleton。公有的静态域是final的,所以该域将总是包含相同的对象引用。

//Singleton with public final field
public class Elvis {
    public static final Elvis INSTANCE = new Elvis();
    private Elvis(){

    }
}

  方法二:静态工厂方法,更加灵活,在不改变其API的前提下,可以改变该类是否应该为Singleton的想法。

//Singleton with public final field
public class Elvis {
    private static final Elvis INSTANCE = new Elvis();
    private Elvis(){
    }

    public static Elvis getINSTANCE() {
        return INSTANCE;
    }
}

  在Java1.5以后,可以通过编写一个包含单个元素的枚举类型来实现Singleton.

  

public enum ElvisE {
    INSTANCE;
    public void other(){};
}

  单元素的枚举类型是实现Singleton的最佳方法

  

 

以上是关于effectiveJava强化Singleton属性的主要内容,如果未能解决你的问题,请参考以下文章

EffectiveJava第三版(最新建议)

Java:Effective java学习笔记之 用私有构造器或者枚举类型强化SIngleton属性

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

第3项:用私有构造器或者枚举类型强化Singleton属性

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

java Singleton