PMD:如何仅忽略lambda表达式中的短变量名

时间:2017-11-06 11:27:43

标签: java intellij-idea lambda pmd

我正在寻找一种解决方案,允许我使用PMD检查短变量名称,同时从此规则中排除lambda。

主要原因是,IntelliJ使用单个字符自动命名常见的lamba变量,尤其是。 java.lang.String总是缩写为

aListFullOfStrings.forEach(s -> s.replaceAll(" ", ""));

我更喜欢这个缩写,但我不想为所有的lambdas添加抑制。我找不到任何方法来调整我的PMD规则以便优雅地解决这个问题。

建议非常感谢 - 我对他们的所有配置都不熟悉。

3 个答案:

答案 0 :(得分:2)

您可以利用PMD的基于xpath的抑制功能。

在规则集XML上,只需为此特定规则配置属性:

<rule ref="rulesets/java/naming.xml/ShortMethodName">
  <properties>
    <property name="violationSuppressXPath" value=".[ancestor::LambdaExpression]"/>
  </properties>
</rule>

尽管如此,作为PMD维护者,我相信这是改变PMD本身规则的合法案例,所以我添加了github.com/pmd/pmd/issues/720来跟踪这个。

答案 1 :(得分:1)

默认情况下,PMD会标记名称少于3个字符的变量,尽管它已经豁免了一些合法的情况,例如for-loop变量。您需要调整PMD,以便它还可以免除lambda表达式中的变量。

这是通过修改PMD的一个名为 naming.xml 的规则集文件之一来完成的,该文件位于jar文件 {pmd installation dir} \ lib \ pmd-java-5.8.1.jar中(如果您使用的是最新版本的PMD)。一种方法如下:

  • 将jar文件 pmd-java-5.8.1.jar 的内容解压缩到某个临时文件夹。

  • 编辑提取的文件 naming.xml 并找到文本规则名称=“ShortVariable”然后插入文本 [not(ancestor ::) LambdaExpression)] ,如下面的粗体所示。

  

[否(祖先:: ForInit)]
  的 [否(祖先:: LambdaExpression)]   [not(../../ VariableDeclarator and ../../../LocalVariableDeclaration   和../../../../ ForStatement)]
  [not((ancestor :: FormalParameter)and(ancestor :: TryStatement))]

  • 您也可以选择进一步调整规则集文件。

  • 使用修改后的 naming.xml 重新创建jar文件。这个命令可以做到:

    jar cf pmd-java-5.8.1.jar net rulesets META-INF

我不知道您拥有的PMD插件的风格和版本,但它们都应该使用 pmd-java-5.8.1.jar 或其早期版本。我只使用PMD本身而不是插件进行了简单的概念验证,并使用此方法从命令行验证了它:

void test() {
    Consumer<String> consumer = (String s) -> System.out.println(s);
    consumer.accept("Hello world!!!");
}

PMD的5.8.1版报告了该代码中lambda变量的以下违规行为:

violation for short variable

但是,如上所述修改 naming.xml 后违规行为已经消失。

答案 2 :(得分:0)

较新的PMD版本现在在命名规则集中使用ShortVariable规则。我在我的ruleset.xml中使用它来使错误消失为lambdas。它仍然捕获短的非lambda变量。

<rule ref="rulesets/java/naming.xml/ShortVariable">
    <properties>
        <property
                name="violationSuppressXPath" value=".[ancestor::LambdaExpression]"/>
    </properties>
</rule>