何时不使用Java中的static关键字?

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


你可能不希望它是静态的一个原因是允许它在一个子类中被覆盖。 换句话说,行为可能不依赖于对象内的数据,而取决于对象的确切类型。 例如,你可能有一个通用的集合类型,与isReadOnly财产将返回false的永远可变集合, true的永远不变的集合,而在其他依赖于实例变量。

然而,这在我的经验中非常罕见 - 通常应该明确说明。 通常我会做一个不依赖任何对象状态静态的方法。


在大型Java应用程序中遇到的两个最大的罪恶是

  • 静态方法,除了那些纯函数*
  • 可变的静态字段
  • 这些破坏了代码的模块化,可扩展性和可测试性,我认识到我不可能希望在这个有限的时间和空间中让你信服。

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

    关于纯粹功能(自我链接)的更多blahblah以及为什么你想坚持他们。

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


    一般来说,我更喜欢实例方法,原因如下:

  • 静态方法使测试变得困难,因为它们不能被替换,
  • 静态方法更加程序化。
  • 在我看来,静态方法可以用于实用类(如StringUtils ),但我更愿意尽可能避免使用它们。

    链接地址: http://www.djcxy.com/p/96351.html

    上一篇: When NOT to use the static keyword in Java?

    下一篇: C++ Static member initialization (template fun inside)