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:
虽然这种方法尚未被广泛采用,但单元素枚举类型是实现单例的最佳方法.