有没有办法让 PMD 规则集忽略圈复杂度的 Hashcode 和 Equals 方法?

Is there a way to make PMD ruleset ignore Hashcode & Equals methods for Cyclomatic complexity?

我已经知道可以添加到我的代码中的各种注释或注释,但这不是我要找的。

我正在寻找一种只让我修改 CyclomaticComplexity 规则的方法。 我没有在规则中看到任何选项,尽管这似乎是一个相当普遍的需求。而且似乎没有 xpath,因为它使用 java class.

如果没有更好的办法,您可以覆盖用于规则的 java class 吗?

你是对的,这条规则没有特定的选项来显式忽略 hashCodeequals 方法。但是,现在应该可以通过 suppressions。每个规则都有一个 "violationSuppressXPath" 属性 - 看起来,这在某种程度上用于此规则,它应该适用于这个用例:它不仅适用于违规行为,而且同时分析源代码。

这是 CyclomaticComplexityRule which inherits from StdCyclomaticComplexityRule. If you look at line 188 的源代码,您会看到已检查方法节点是否有任何抑制。如果该方法被抑制,则不会对其进行分析,并且 不应计入 class 复杂度。 [请参阅下面的更新]。

violationSuppressXPath 的可能的 XPath 表达式可能如下所示:

./MethodDeclarator[@Image='hashCode' or @Image='equals']

您需要使用 custom ruleset,才能配置 属性。您的规则集可能如下所示:

<?xml version="1.0"?>
<ruleset name="Custom ruleset"
    xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 http://pmd.sourceforge.net/ruleset_2_0_0.xsd">
  <description>CyclomaticComplexity ignoring hashCode and equals</description>

    <rule ref="rulesets/java/codesize.xml/CyclomaticComplexity">
        <properties>
            <property name="violationSuppressXPath" value="./MethodDeclarator[@Image='hashCode' or @Image='equals']"/>
        </properties>
    </rule>
</ruleset>

请注意,我的示例使用 PMD 5。4.x - 它比您提到的 PMD 4.3 更新得多。规则组织已更改以支持多种语言 - 这意味着 PMD 4.3 的规则参考将只是 rulesets/codesize.xml/CyclomaticComplexity.

更新 (2016-05-20)

使用配置的 violationSuppressXPath 属性,方法 "equals" 和 "hashCode" 不再突出显示。仅抑制违规消息。 但是方法的内容仍然计算class的总复杂度,因此任何conditions/ifstatements/loops/etc。被检查(这是因为 super.visit()line 186 的抑制之前被调用)并且因为 isSuppressed 检查只理解注释。

这意味着,虽然方法本身不再突出显示,但 class 是,因为它包含一个复杂的方法。

完全忽略 equals/hashCode 方法的唯一方法是用

注释它们
@SuppressWarnings("PMD.CyclomaticComplexity")

然后,它们将被完全忽略,并且真的不计入 class 复杂度。

对我有用。

 // Ignore PMD warning that equals and hashCode should be defined, while we need only custom equals.
@SuppressWarnings("PMD.OverrideBothEqualsAndHashcode")
class DefineYourClass...