有没有办法让PMD规则集忽略Hashcode&等于Cyclomatic复杂性的方法?

时间:2016-05-12 18:58:41

标签: java hashcode pmd cyclomatic-complexity

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

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

如果没有更好的方法可以覆盖用于规则的java类吗?

2 个答案:

答案 0 :(得分:2)

您是对的,此规则没有特定选项,明确忽略hashCodeequals方法。但是,现在应该可以通过suppressions。每个规则都有一个“violationSuppressXPath”属性 - 看起来,它在某种程度上用于此规则,它应该适用于这个用例:它不仅适用于违规,还适用于分析源代码。 / p>

以下是继承自CyclomaticComplexityRuleStdCyclomaticComplexityRule的源代码。如果查看line 188,您将看到方法节点被检查是否有任何抑制。如果该方法被抑制,则不进行分析,不应计入类复杂度。 [见下面的更新]。

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”不再突出显示。仅抑制违规消息。 然而方法的内容仍然计入类的总复杂性,以便任何条件/ if语句/循环/等。被检查(这是因为在line 186抑制之前调用了super.visit()),因为isSuppressed检查只能理解注释。

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

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

注释这些方法
@SuppressWarnings("PMD.CyclomaticComplexity")

然后,他们完全被忽略了,并且真的不计入阶级复杂性。

答案 1 :(得分:0)

对我有用。

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