我有一行代码如下所示:
String someString = "something";
if (Foo.SOME_CONSTANT_STRING.equals(someString))
导致违规:“可能违反德米特法则(静态财产访问)”
这里建议的方法是什么?
(编辑:我更改了代码示例)
我有一行代码如下所示:
String someString = "something";
if (Foo.SOME_CONSTANT_STRING.equals(someString))
导致违规:“可能违反德米特法则(静态财产访问)”
这里建议的方法是什么?
(编辑:我更改了代码示例)
访问静态变量的问题是您正在对难以测试的类强制执行外部状态。您应该通过类变量访问它,例如:
private final Foo SOME_CONSTANT = Foo.SOME_CONSTANT_STRING;
public void doSomething(){
String someString = "something";
if (SOME_CONSTANT.equals(someString)){
doTheWave();
}
}
这与 SOME_CONSTANT 的 getter 一起,允许更精确地测试函数的“初始状态”。
你应该写
if ("hello".equals(Foo.SOME_CONSTANT_STRING))
因为据 PMD 所知,Hello
肯定不是null
什么时候Foo.SOME_CONSTANT_STRING
可能不是。
另外,请查看维基百科关于得墨忒耳法则的页面,以更好地理解它。
@Alix
这个问题很老了,有很多回答,但我认为缺少正确的答案,所以我放下我的答案:
SOME_CONSTANT_STRING
应该声明final
此外,正如其他用户之前提到的,String.equals
对null
String 对象的调用可能会导致 NPE(空指针异常),并且最好在应用程序中避免这种情况,以免出现不可预知的行为。一个null
论点String.equals
是完全可以接受的。因此,如果我们想使用String
常量(对象)来执行这样的比较,我们应该使用这些常量final
。
坦率地说,我认为另一个类中的静态属性应该被视为一个全局常量,它可以被得墨忒耳法则访问和允许。我不明白为什么必须始终将它定义为类变量,除了绕过 PMD 中的规则实现,也许是为了避免在类中的任何地方重复双点或三点访问器。在某些情况下,静态导入可能会减轻它。
https://github.com/pmd/pmd/issues/2179
我已经提出了同样的问题。