【问题标题】:Singleton using Static Members and Methods? [duplicate]单例使用静态成员和方法? [复制]
【发布时间】:2014-02-14 21:57:08
【问题描述】:

我们可以通过使用静态方法和成员元素创建一个类来复制单例行为。除了序列化之外,仅使用静态 Body 实现单例有什么害处。

【问题讨论】:

  • 我没有在那个帖子中找到我的答案。我相信另一个线程是关于单例的缺点。我在问为什么我们不能用静态主体替换 commin 使用的实现。
  • 谢谢卡佩普。这看起来不错。

标签: java oop


【解决方案1】:

您不能使用此模式来实现某个接口的提供程序或允许子类化或其他替代行为。这意味着测试变得更加困难,并且您不能对静态类所做的任何事情使用依赖注入。

【讨论】:

  • 谢谢。明白了。我相信无法参与 Runetime Polymorphism 是我们从未使用此实现的最大原因。伟大的。再次感谢。
  • 我相信它是相关的,因为我们不能覆盖静态方法。伟大的。我知道还有一些其他的东西,比如序列化、延迟加载等,但我错过了这个非常重要的原因。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    Akwardness or hoop-jumping to unit test 这样的“单例”是除了序列化之外的一个潜在缺点。

    将此与unit testing a true (i.e. instantiable) singleton 进行对比。

    最终,单例保证了一个类的单个 instance,而 @JStevenPerry 指出的静态类不可实例化(我希望您已经理解):两者根本不一样尽管它们可以在许多方面类似地使用。

    【讨论】:

      猜你喜欢
      • 2012-09-28
      • 2012-10-20
      • 1970-01-01
      • 1970-01-01
      • 2018-04-29
      • 1970-01-01
      • 2013-09-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多