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

问题描述 投票:1回答:1

我正在使用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

java pmd law-of-demeter
1个回答
0
投票

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

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

否则,此方法链接规则会变得很累。

© www.soinside.com 2019 - 2024. All rights reserved.