我们可以使用静态方法和成员元素复制Singleton行为。除了序列化只使用静态Body实现单例的危害是什么。
答案 0 :(得分:4)
您不能使用此模式为某个接口实现提供程序或允许子类化或其他替代行为。这意味着测试变得更加困难,并且您不能对静态类所做的任何事情使用依赖注入。
答案 1 :(得分:4)
Singleton是一个类的单个实例(即一个对象)。静态代码块不是对象。这只是代码。
这似乎有一个明显的区别:
public class MyClass {
public static void doIt() {
System.out.println("doIt()");
}
}
而且:
public class MySingleton {
private static MySingleton _singleton = null;
private String cantTouchThis;
private MySingleton() {
cantTouchThis = "Hands off, static block!";
}
public static MySingleton newInstance() {
if (_singleton == null) {
_singleton = new MySingleton();
}
return _singleton;
}
}
在第一种情况下,基本上你只有一个代码块,你可以通过调用MyClass.doIt()来执行。在第二个中,通过调用MySingleton.newInstance(),您可以获得一个诚实善良的对象。
HTH
答案 2 :(得分:1)
Akwardness or hoop-jumping to unit test这样的“单身人士”是一个潜在的缺点。
将此与unit testing a true (i.e. instantiable) singleton对比。
最终,单例保证一个类的单个实例,而静态类不可实现,因为@JStevenPerry指出(我希望你已经明白):这两个根本不一样虽然他们可以在很多方面采用类似的方式。