3

我有一行代码如下所示:

String someString = "something"; if (Foo.SOME_CONSTANT_STRING.equals(someString))

导致违规:“可能违反德米特法则(静态财产访问)”

这里建议的方法是什么?

(编辑:我更改了代码示例)

4

4 回答 4

2

访问静态变量的问题是您正在对难以测试的类强制执行外部状态。您应该通过类变量访问它,例如:

private final Foo SOME_CONSTANT = Foo.SOME_CONSTANT_STRING;
public void doSomething(){
    String someString = "something";
    if (SOME_CONSTANT.equals(someString)){
        doTheWave();
    }
}

这与 SOME_CONSTANT 的 getter 一起,允许更精确地测试函数的“初始状态”。

于 2016-11-02T08:00:33.057 回答
1

你应该写

if ("hello".equals(Foo.SOME_CONSTANT_STRING))

因为据 PMD 所知,Hello肯定不是null什么时候Foo.SOME_CONSTANT_STRING可能不是。

另外,请查看维基百科关于得墨忒耳法则的页面,以更好地理解它。

于 2015-10-12T12:06:25.603 回答
0

@Alix

这个问题很老了,有很多回答,但我认为缺少正确的答案,所以我放下我的答案:

    SOME_CONSTANT_STRING应该声明final

此外,正如其他用户之前提到的,String.equalsnullString 对象的调用可能会导致 NPE(空指针异常),并且最好在应用程序中避免这种情况,以免出现不可预知的行为。一个null论点String.equals是完全可以接受的。因此,如果我们想使用String常量(对象)来执行这样的比较,我们应该使用这些常量final

于 2017-07-11T11:06:48.843 回答
0

坦率地说,我认为另一个类中的静态属性应该被视为一个全局常量,它可以被得墨忒耳法则访问和允许。我不明白为什么必须始终将它定义为类变量,除了绕过 PMD 中的规则实现,也许是为了避免在类中的任何地方重复双点或三点访问器。在某些情况下,静态导入可能会减轻它。

https://github.com/pmd/pmd/issues/2179

我已经提出了同样的问题。

于 2019-12-22T15:06:54.203 回答