应该以静态方式访问。

5

我有一个类的名字可能不必要地繁琐,其中包含很多我在其他地方使用的静态方法。

与其在我的代码中充斥着大量的

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标签,因此会被视为不相关并被拒绝。然而,我认为在这里有一个像这样的问题的空间,所以我把它交给大家。

改变VeryUnnecessarilyLongCumbersomeName类怎么样? - Psychotechnopath
1
thing.doThing...() 表示 doThing....()thing 进行了某些操作,或者至少从 thing 中读取了一些值。因此,这个调用至少是具有误导性的。我同意 @Psychotechnopath 的观点,重命名 VeryUnnecessarilyLongCumbersomeName 是一个更可行的选择。 - Turing85
2
静态方法的导入怎么样? - Roger Lindsjö
有点儿hack,但通过一些修改,你可以像这样链式调用: https://ideone.com/8LlGvO - 001
2个回答

3
虽然从技术上讲它并不是“有害”的,因为它从技术上讲“有效”,但问题在于这是误导性的,并且实例“thing”包含的任何值对方法的结果实际上根本没有影响。
典型的Java约定:
通过实例访问方法时,人们会期望结果取决于实例的值。
通过类名访问方法时,人们会期望结果与任何实例的值无关。
你的方式:
你正在通过实例访问一个独立于任何实例的方法,并期望它是独立的。
那么为什么要在一个实例独立的方法中使用实例呢?这就是为什么它是具有误导性的。我建议尝试缩短类名而不是通过实例访问静态方法。

1
这是一个关于误导性问题的优秀解释。谢谢! - Frank Harris
@Frank Harris 只是额外提供一些你可能会感兴趣的信息,你甚至可以使用 VeryUnnecessarilyLongCumbersomeName thing = null;,然后仍然使用带有 nullthing 的方法,这可以展示这样做有多奇怪。 - Nexevis

1
如何更改VeryUnnecessarilyLongCumbersomeName类呢?
静态方法是用来在没有实例的情况下使用的。它们的目的是在不先初始化类的情况下调用方法。使用静态方法的缺点是,你失去了所有面向对象编程的好处;你失去了虚拟分派和后续的多态性。你永远无法在派生类中覆盖该方法。当然,你可以在派生类中声明一个new (static)方法,但任何访问它的代码都必须知道整个类层次结构并进行显式检查和转换,这正是面向对象编程所要避免的。
此外,它很令人困惑。当另一个程序员看到你的代码时,他/她会认为看到一个static时,他/她会假设不需要一个有效的实例来调用该方法。
简而言之,请不要这样做,坚持最佳实践 =)

我认为,在我的情况下,最好的做法是将其从 VULCN 中删除,并放入一个更简洁的实用类中。当然,我承认,只要我们谈论最佳实践,许多人会说实用类也不是一个有效的解决方案 :) - Frank Harris
是的,一个实用类当然可以解决问题。 - Psychotechnopath

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接