Singleton using Static Members and Methods?
本问题已经有最佳答案,请猛点这里访问。
我们可以用静态方法和成员元素复制我的生成类的单例行为。除了序列化之外,只使用静态主体实现单例有什么害处。
单例是类的单个实例(即一个对象)。静态代码块不是对象。这只是代码。
这两者之间似乎有着明显的区别:
1 2 3 4 5 |
而这:
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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(),您可以获得一个诚实善良的对象。
高温高压
不能使用此模式为某些接口实现提供程序,也不能允许子类化或其他替代行为。这意味着测试变得更加困难,并且不能对静态类所做的任何事情使用依赖注入。
Akwardness或Hoop跳转到单元测试这样的"singleton"除了序列化之外,还有一个潜在的缺点。
将这与单元测试一个真正的(即可实例化的)单例进行对比。
最后,singleton保证一个类的单个实例,而静态类是不可实例化的,正如@jstevenpery指出的那样(我希望您已经理解):这两个类是完全不同的,尽管它们在许多方面可以被类似地使用。