何时不使用Java中的static关键字?
什么时候在方法签名中使用Java中的static关键字被认为是不好的做法? 如果一个方法根据一些参数执行一个函数,并且不需要访问非静态的字段,那么你是否总是希望这些类型的方法是静态的?
你可能不希望它是静态的一个原因是允许它在一个子类中被覆盖。 换句话说,行为可能不依赖于对象内的数据,而取决于对象的确切类型。 例如,你可能有一个通用的集合类型,与isReadOnly
财产将返回false
的永远可变集合, true
的永远不变的集合,而在其他依赖于实例变量。
然而,这在我的经验中非常罕见 - 通常应该明确说明。 通常我会做一个不依赖任何对象状态静态的方法。
在大型Java应用程序中遇到的两个最大的罪恶是
这些破坏了代码的模块化,可扩展性和可测试性,我认识到我不可能希望在这个有限的时间和空间中让你信服。
*“纯函数”是不修改任何状态的任何方法,其结果仅取决于提供给它的参数。 因此,例如,任何执行I / O(直接或间接)的函数都不是纯函数,但Math.sqrt()当然是。
关于纯粹功能(自我链接)的更多blahblah以及为什么你想坚持他们。
我强烈建议你支持“依赖注入”编程风格,可能由Spring或Guice等框架支持(免责声明:我是后者的合着者)。 如果你这样做,你将永远不需要可变静态或非纯静态方法。
一般来说,我更喜欢实例方法,原因如下:
在我看来,静态方法可以用于实用类(如StringUtils
),但我更愿意尽可能避免使用它们。