【发布时间】:2014-02-14 21:57:08
【问题描述】:
我们可以通过使用静态方法和成员元素创建一个类来复制单例行为。除了序列化之外,仅使用静态 Body 实现单例有什么害处。
【问题讨论】:
-
我没有在那个帖子中找到我的答案。我相信另一个线程是关于单例的缺点。我在问为什么我们不能用静态主体替换 commin 使用的实现。
-
谢谢卡佩普。这看起来不错。
我们可以通过使用静态方法和成员元素创建一个类来复制单例行为。除了序列化之外,仅使用静态 Body 实现单例有什么害处。
【问题讨论】:
您不能使用此模式来实现某个接口的提供程序或允许子类化或其他替代行为。这意味着测试变得更加困难,并且您不能对静态类所做的任何事情使用依赖注入。
【讨论】:
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
【讨论】:
Akwardness or hoop-jumping to unit test 这样的“单例”是除了序列化之外的一个潜在缺点。
将此与unit testing a true (i.e. instantiable) singleton 进行对比。
最终,单例保证了一个类的单个 instance,而 @JStevenPerry 指出的静态类不可实例化(我希望您已经理解):两者根本不一样尽管它们可以在许多方面类似地使用。
【讨论】: