关于Java:singleton使用静态成员和方法?

Singleton using Static Members and Methods?

本问题已经有最佳答案,请猛点这里访问。

我们可以用静态方法和成员元素复制我的生成类的单例行为。除了序列化之外,只使用静态主体实现单例有什么害处。


单例是类的单个实例(即一个对象)。静态代码块不是对象。这只是代码。

这两者之间似乎有着明显的区别:

1
2
3
4
5
public class MyClass {
  public static void doIt() {
    System.out.println("doIt()");
  }
}

而这:

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指出的那样(我希望您已经理解):这两个类是完全不同的,尽管它们在许多方面可以被类似地使用。