我有一个类,其名称可能不必要地繁琐,其中包含了我在其他地方使用的许多静态方法。
而不是用大量的
VeryUnnecessarilyLongCumbersomeName.doThingFoo();
VeryUnnecessarilyLongCumbersomeName.doThingBar();
VeryUnnecessarilyLongCumbersomeName.doThingEgg();
VeryUnnecessarilyLongCumbersomeName.doThingSpam();我宁愿
VeryUnnecessarilyLongCumbersomeName thing = new VeryUnnecessarilyLongCumbersomeName();
thing.doThingFoo();
thing.doThingBar();
thing.doThingEgg();
thing.doThingSpam();但是,这会得到警告。
"the static method doThingFoo() should be accessed in a static way."我知道这里有多种解决方案。使用更好的类名。让它不是静止的。忽略它,因为这只是一个警告。
但我并不认为这应该是个警告。这样做有什么害处?是否有一种更优雅/更正确的方法使我的代码不那么笨重--这不是上述解决方案之一?
注意:我怀疑这可能是coding-style标签的理由,因此被认为是非主题的,并被拒绝。我在想这样的问题还有空间,所以我就留给你们了。
发布于 2020-02-05 18:59:31
虽然它在技术上并不有害,因为它在技术上是有效的,但问题在于它具有误导性,而且实例thing包含的任何值实际上对方法的结果都不重要。
典型Java公约:
当通过实例访问方法时,人们会期望结果是依赖于实例的值的。
当通过类名访问方法时,人们会期望结果是任何实例的值的独立的。
Your:
您正在通过实例访问方法,并期望它是任何实例的独立的。
那么,为什么要为独立于实例的方法使用实例呢?这就是为什么它具有误导性。我建议尝试缩短类名,而不是通过实例访问static方法。
发布于 2020-02-05 18:57:53
更改VeryUnnecessarilyLongCumbersomeName类如何?
静态方法可以在没有实例的情况下使用。如果您想要调用方法而不首先初始化类,则应该使用它们。使用静态方法的缺点是,您失去了各种OOP好处;您失去了虚拟调度和随后的多态。不能在派生类中重写该方法。当然,您可以在派生类中声明new (static)方法,但是任何访问它的代码都必须知道整个类层次结构,并进行显式检查和转换,这正是OO应该避免的。
而且,这也令人困惑。当另一个程序员看到您的代码时,他/她会在看到一个static时考虑,他/她会假设它不需要一个有效的实例来调用该方法。
不要这样做,坚持最佳实践=)
https://stackoverflow.com/questions/60082299
复制相似问题