或者实现Singleton

Mat*_*t.S 7 java design-patterns

实现单例设计模式的标准方法是:

public class Singleton {
    private static Singleton instance = new Singleton();

    public static Singleton getInstance() {
        return instance;
    }

    private Singleton() {}
}
Run Code Online (Sandbox Code Playgroud)

我想知道你是否也可以像这样实现它:

public class Singleton {
    private Singleton() {}
    public final static Singleton INSTANCE = new Singleton();
}
Run Code Online (Sandbox Code Playgroud)

如果是,哪个版本更好?

jas*_*son 10

都不是.在这两种情况下,受信任的使用者都可以通过反射调用私有构造函数.另一个问题是,这些实现不能很好地与序列化一起使用,除非你采取额外的步骤来实现它(默认情况下,如果采用天真的方法,每次Singleton反序列化时,它都会创建一个新实例).

正确的解决方案是使用enum定义单个值的方法.

public enum Singleton {
    INSTANCE;

    // methods
}
Run Code Online (Sandbox Code Playgroud)

来自Effective Java:

虽然这种方法尚未被广泛采用,但单元素枚举类型是实现单例的最佳方法.