【问题标题】:Is it bad practice to have a static class that does not instantiate objects有一个不实例化对象的静态类是不好的做法吗
【发布时间】:2015-06-11 00:00:47
【问题描述】:

我读到一个类就像一个对象的蓝图。那么,声明一个类但在程序中却从未实际创建该类的实例(而只是在该类中具有静态方法)被认为是一种不好的做法吗?

【问题讨论】:

  • 取决于语言。例如的答案Java 和 Python 完全不同。
  • 有很多非常合理的最终实用程序类,其私有构造函数仅由静态方法组成。考虑 java.lang.Math。
  • 我已经回答了java并发布了解释的直接链接
  • 取决于你想要达到的目标,而不是语言或其他任何东西。

标签: java class oop


【解决方案1】:

我会说,在面向对象的编程中,我应该尽量减少对静态的使用,但它们确实有一席之地。需要一些时间来了解静态方法/变量何时合适,所以我会开始只在一小部分鼓励它们的情况下使用它们,然后随着你的经验扩大你的使用范围。列出一些适当的用途:

在任何关于使用静态的讨论中,都值得discussing dependency injection and writing testable code,因为这些原则不鼓励使用global state,这通常是声明为静态的东西的副作用。

【讨论】:

    【解决方案2】:

    如果您的类没有任何关联的状态(意味着没有实例变量),那么拥有所有静态方法就可以了。一个示例是一个简单的实用程序类,它封装了您在每个 DAO 中需要的行为,例如关闭数据库连接、语句和结果集。我对我创建的每个项目都这样做。

    不过,您要小心使用静态方法,因为它们不能被覆盖,而且在某些情况下很难测试。

    【讨论】:

      【解决方案3】:

      由于多种原因,静态被认为是一种非常糟糕的做法

      • 很难测试
      • 您会很快发现自己在改变价值观,却不知道“神奇地发生在哪里”

      静态类最大的问题是你不能模拟它们,这意味着你不能测试使用它们的代码。 有时需要实用程序类,但它本身被认为是一种气味,因为在SOLID 原则中,一个类应该有它的责任,并且通过创建一个实用程序(通用)类,你打破了“单一责任原则”

      此外,静态原则与语言无关,而是与 OO 原则本身有关。

      there are huge amount of articles

      SO itself 就够了

      【讨论】:

      • 静态类最大的问题是你不能模拟它们”。了解您的工具,例如使用PowerMock.
      • @Turing85 了解并拥有工具很重要,但是您可以轻松地手动编写这样的模拟吗?特别是对于初学者来说,了解模拟的最佳方式是尝试手写以了解为什么需要工具
      • “你不能模拟它们,这意味着你不能测试它们”。是不是更像“你不能测试使用它们的代码”?您不是在测试用模拟替换的代码,而是在测试(通常)依赖于该代码的其他代码。
      • 是的,PowerMock 可以通过弄乱类加载器来模拟静态的东西,例如混淆了 Jacoco 等代码覆盖工具。不好恕我直言。仅将它用于第三方的东西,总是会重构我自己的代码以使其可测试,而无需使用大型工具。
      • 只有当类具有可变状态时,所有这些都是正确的。许多类没有,这完全没问题:java.lang.Math、java.until.Collections、无数番石榴类,如 Sets、UnsignedLongs 等
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-23
      • 2011-02-14
      • 2010-12-28
      • 2011-09-22
      • 2018-01-20
      • 1970-01-01
      相关资源
      最近更新 更多