为什么PMD在此get函数中给我违反Demeter的法律?

时间:2018-10-17 11:26:18

标签: java pmd law-of-demeter

我正在使用IntelliJ PMD插件,它在if(keys[i].equals(key))上违反了LOD。键是函数中同一类中的对象。

public Object get(Object key) {
    int n,i;
    for(i=0,n=0;i<keys.length;i++) {
        if(n >= nelems)
            break ;
        if ( keys[i] == null )
            continue;
        if(keys[i].equals(key))
            return values[i] ;
        n++ ;
    }
    return null;
}

您可以在此处找到完整的代码:https://raw.githubusercontent.com/Sable/abc/master/benchmarks/Jigsaw/src/classes/org/w3c/util/ArrayDictionary.java

1 个答案:

答案 0 :(得分:0)

如果您不希望将其标记为错误,则可以将索引字段键[i]包装为新的String(keys [i])并在此新对象上调用equals函数。这种丑陋的骇客将破坏规则。

但是,我认为,更好的解决方案是从此规则中过滤诸如String,Integer,Long等基类。其次,不可变类也应免除此规则。注释@Immutable可用于实现此目的。这将必须由PMD团队实施。

另一个选择是通过类边界而不是对象边界来定义规则。如果方法返回相同类或原始类的对象,则不计入该对象。如果是原始类型,则必须不受该规则的应用。

这种方法链条的规则变得很累人。