【问题标题】:When use a static class instead of the singleton pattern?何时使用静态类而不是单例模式?
【发布时间】:2012-01-11 05:46:56
【问题描述】:

我已经阅读了this 问题和一些类似的问题,我想知道是否有什么情况应该在单例模式上使用静态类?

【问题讨论】:

  • 那么您为什么不阅读该问题的答案?他们完美地总结了使用单例或静态类的情况。再次总结一下:当您想要一个(并且只有一个)应用程序中特定类的实例时,请使用单例。不需要实例时使用静态工具类,所有方法都可以静态调用(静态类是无状态的,即没有内部非静态变量)
  • 它们很好地涵盖了使用单例相对于静态的优势,但是在反向音调中几乎什么都没有(是的,几乎 - 但我很好奇是否有任何强反对在任何情况下使用单例)。
  • @mre 请先阅读我的问题。我链接到你提到的问题。
  • @AdamPierzchała,您链接的问题回答了您的问题。
  • 投票重新打开,问题询问标记重复的确切对面。 OP 想知道何时更喜欢静态而不是单例,而不是相反 - 正如被欺骗的链接所暗示的那样

标签: java design-patterns


【解决方案1】:

当您有“仅代码”方法时,使用静态“实用程序”类(只有静态方法的类) - 您不需要的方法需要基类的任何特定实现或界面。关键指标是代码是无状态 - 即类中没有(静态)字段来赋予它状态。无状态也意味着这些方法是自动线程安全的——另一个好处。

JDK 中有很多示例(Collections 是一个值得注意的示例),这种模式的apache commons libraries 运行良好。

此外,为了避免“类膨胀”,您可以使用静态(抽象)工厂方法返回特定实现,而不是为特定的琐碎实现创建一个类,例如:

public static Comparator<String> createCaselessStringCompatator() {
    return new Comparator<String> () {
        public int compare(String o1, String o2) {
            return o1.toUpperCase().compareTo(o2.toUpperCase());
        }
    }; 
}

public static Comparator<String> createNumericStringCompatator() {
    return new Comparator<String> () {
        public int compare(String o1, String o2) {
            return new Double(o1).compareTo(new Double(o2));
        }
    }; 
}

这种模式避免了为仅仅一行实际有用的代码(即“closure”)创建一个全新的类文件并且它将它们捆绑在一起,所以如果你知道你的实用程序类名称,您的 IDE 会提示您选择哪个 impl:

Collections.sort(myStringList, MyComparators.|<-- ctrl+space to offer options

如果没有这种模式,您必须记住每个实现的类名。

【讨论】:

  • 谢谢,我接受了这个,因为没有比这更好的了(我不是说它不够好;))从那时起就出现了。
【解决方案2】:

我认为在这种情况下,您需要为一些同样是静态的实用程序功能提供一个位置。

【讨论】:

  • 在某些情况下,静态方法可以与静态导入结合使用。虽然我们需要小心使用静态导入(可能会降低可读性)
猜你喜欢
  • 2012-04-06
  • 2011-02-27
  • 2010-11-07
  • 1970-01-01
  • 1970-01-01
  • 2012-04-02
  • 1970-01-01
  • 1970-01-01
  • 2011-02-15
相关资源
最近更新 更多