【问题标题】:Java - Only one instance of class: use static methods instead?Java - 只有一个类实例:改用静态方法?
【发布时间】:2017-05-23 03:59:43
【问题描述】:

如果我知道一个特定的类只会在我的程序中被实例化一次,那么使用静态方法和变量来代替那个特定的类会更好吗?如果没有,如果该类只有一个实例,那么使用实例方法和变量比使用静态方法和变量有什​​么好处?

【问题讨论】:

  • 可以将其设为enum。但是为什么要限制自己呢?如果您需要两个或三个实例怎么办?
  • 如果你真的知道这将是一个实例,那么你应该使用(单例)模式
  • 这个问题可能有用:stackoverflow.com/questions/519520/…
  • Singleton 绝对是一种方法。但是,我建议考虑一个返回单个实例的Factory 模式。如果需要为此目的更改单例,这种方法可以使测试更容易。
  • 可测试性!单例和静态方法都存在可测试性问题。如果由我决定,我也不会使用。

标签: java


【解决方案1】:

这取决于您需要该课程做什么,以及您将来可能需要它做什么。这还取决于有多少人将看到或使用此代码。如果这段代码只会被你看到和使用,而不是选择一个实现并一直遵循它,那么强迫自己切换到另一个实现作为练习可能会很有启发性。

假设您的代码将被其他程序员看到或使用:

如果对象是您需要在测试中模拟的东西(例如数据库连接),那么最好让您的方法成为实例方法,并找到其他策略来确保您只拥有一个.

如果有任何机会您的班级所做的事情可以通过另一种方式完成(例如,您的班级将程序的输出写入 excel 文件)然后将班级的实例传递给需要它们的任何方法是帮助使您的代码更灵活的好方法(例如,如果以后您决定要生成 html 输出,您所要做的就是编写您的 excel 编写器的姊妹实现并将其传递进去)。

如果您几乎 100% 确定您的代码永远不需要被模仿(也称为“模拟”)并且您永远不需要利用多态性(例如 Java 中的 Math 类),那么静态方法可能会没关系,但这种情况很少见。

【讨论】:

    【解决方案2】:

    我们来讨论何时使用singletonstatic 方法。之前已经在这个网站上讨论过它,所以我会在这个答案的末尾指出这一点。

    查看此问题的一种方法是询问该类是否具有状态,是否需要对其进行子类化,如何对其进行测试,单例是否会在依赖注入框架中使用,即是否会被注入?

    如果您对上述任何一项的回答是“yes”,那么您最好使用singleton - 如果不是,那么您可以使用static 方法。

    但是,下面的链接中更详细地讨论了这两种方法,说明为什么应该或不应该使用它们。

    请参阅 this 了解“为什么单身不好”。

    请参阅this 了解“何时不使用静态方法”。

    【讨论】:

    • Eric Galluzzo 对您所链接的第二个问题的回答非常棒。
    猜你喜欢
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-29
    • 1970-01-01
    • 2011-03-09
    相关资源
    最近更新 更多