《Effective Java》读书笔记:Item3实现单例的几种方式

方法一:public field

public class ExampleSingleton{
    public static final ExampleSingleton INSTANCE = new ExampleSingleton();
    private ExampleSingleton(){ ... }
    public void doSomething(){ ... }
}

方法二:static factory

public class ExampleSingleton{
    private static final ExampleSingleton INSTANCE = new ExampleSingleton();
    private ExampleSingleton(){ ... }
    public static ExampleSingleton getInstance(){
        return INSTANCE;
    }
    public void doSomething(){ ... }
}

前者优点是简单;后者优点是灵活,如果想去除单例模式,可以不用修改API。共同缺点:反射(见Item65)和反序列化时(Item89)会创建不止一个实例。

方法三:利用枚举(推荐)

public enum ExampleSingleton{
    INSTANCE;
    public void doSomething(){ ... }
}

优点:反射和反序列化时依然保证单一实例,原理根据《Thinking in Java》第12章介绍,编译器会保证一旦enum定义结束,不允许再使用构造器创建实例。

 

最后,关于方法二中线程同步的讨论,书中没有涉及,可参考:https://www.cnblogs.com/happy4java/p/11206105.html

 

 

你可能感兴趣的:(Java,java,设计模式)