何时不在 Java 中使用静态关键字?

2022-09-01 09:09:39

在 Java 中对方法签名使用 static 关键字时,何时被认为是不好的做法?如果一个方法基于某些参数执行函数,并且不需要访问非静态字段,那么你不是总是希望这些类型的方法是静态的吗?


答案 1

在大规模Java应用程序中,您将遇到的两个最大的邪恶是

  • 静态方法,纯函数除外*
  • 可变静态字段

这些破坏了你代码的模块化、可扩展性和可测试性,以至于我意识到,在这个有限的时间和空间里,我不可能指望说服你。

*“纯函数”是任何不修改任何状态的方法,其结果仅取决于提供给它的参数。因此,例如,任何执行I / O(直接或间接)的函数都不是纯函数,但Math.sqrt()当然是纯函数。

更多关于纯函数(自链接)的废话,以及你为什么想坚持它们。

我强烈建议你支持“依赖注入”的编程风格,可能由Spring或Guice等框架支持(免责声明:我是后者的合著者)。如果你做得对,你基本上永远不需要可变的静态状态或非纯静态方法。


答案 2

您可能不希望它是静态的一个原因是允许在子类中覆盖它。换句话说,行为可能不依赖于对象中的数据,而是取决于对象的确切类型。例如,您可能有一个常规集合类型,其属性将在始终可变集合中返回,在始终不可变集合中返回,并依赖于其他集合中的实例变量。isReadOnlyfalsetrue

但是,在我的经验中,这是非常罕见的 - 为了清楚起见,通常应该明确指定。通常,我会制作一个不依赖于任何对象状态的静态方法。


推荐