【问题标题】:Java Checkstyle Rule To Restrict Method Empty LinesJava Checkstyle 规则来限制方法空行
【发布时间】:2020-07-22 07:51:30
【问题描述】:

有没有办法设置 checkstyle 来防止方法体中出现前导、多行或尾随空行:

例如

private void a() {
-
int a = 1;
doStuff(a);
-
-
doMoreStuff(a);
-
}

在上面的示例中,我用- 字符表示空行。

我希望能够在方法主体中防止前导行、尾随行和多行。

【问题讨论】:

  • 使用自动代码格式化程序。
  • 目的是通过 checkstyle 规则强制执行此操作,以便自动构建可以验证格式,如果有人忘记应用格式化程序,可能会导致 CI​​ 构建失败。

标签: checkstyle


【解决方案1】:

要在任何块的开头和结尾强制没有空行,您可以使用多行正则表达式检查:

<module name="RegexpMultiline">
    <property name="message" value="Blank line at start of block should be removed" />
    <property name="format" value="(?&lt;=\{\s{0,99}$)^$" />
    <property name="fileExtensions" value="groovy,java" />
</module>
<module name="RegexpMultiline">
    <property name="message" value="Blank line at end of block should be removed" />
    <property name="format" value="(?&lt;!\{\s{0,99}$)^$(?=^\s{0,99}\})" />
    <property name="fileExtensions" value="groovy,java" />
</module>

"^$" 表示空行。

【讨论】:

  • 看起来很有希望,但似乎匹配所有换行符,甚至在方法或字段声明之前或之后。
  • 这里是一个更健壮的块开始表达式:
  • 这里有一个更健壮的块结束表达式:
【解决方案2】:

为了防止出现多个空行,您可以使用EmptyLineSeparator 检查。它的主要目的是确保文件中的成员之间有一个空行,但它还有一个allowMultipleEmptyLines 属性,您可以将其设置为“false”以禁止它们。

然而,目前有一个 bug 带有检查,这意味着它不能正确检测方法之间存在注释(包括 JavaDoc)的方法之间的多个空行。我目前正在为此工作fix

至于在块的开头或结尾检查新行,我认为 RegexpMultiline 检查将是 Pankaj 回答中提到的唯一选项。

【讨论】:

    【解决方案3】:

    为了防止方法体中出现空行,您可以使用:

    <module name="RegexpMultiline">
        <property name="message" value="Blank line at start of method should be removed"/>
        <property name="format" value="\(.*\)\s*\{\s*\n\s*\n"/>
    </module>
    

    我们可以通过括号找到方法。

    【讨论】:

      【解决方案4】:

      可以使用:

      <module name="Regexp">
          <property name="message" value="Blank line at start of block is not allowed"/>
          <property name="format" value="\{\s*$^\s*$"/>
          <property name="ignoreComments" value="true"/>
          <property name="illegalPattern" value="true"/>
      </module>
      <module name="Regexp">
          <property name="message" value="Blank line at end of block is not allowed"/>
          <property name="format" value="^\s*$^\s*\}"/>
          <property name="ignoreComments" value="true"/>
          <property name="illegalPattern" value="true"/>
      </module>
      

      【讨论】:

        【解决方案5】:

        这是我在方法开头检查空行的建议

        <module name="RegexpMultiline">
            <property name="id" value="RegexpMultilineEmptyRowBeforeStartOfMethod"/>
            <property name="message" value="Blank line at start of method or block should be removed"/>
            <property name="format" value="\)(\s)*\{\r?\n(\s)*\n"/>
            <property name="fileExtensions" value="java"/>
        </module>
        

        【讨论】:

          猜你喜欢
          • 2013-04-15
          • 2012-10-12
          • 1970-01-01
          • 1970-01-01
          • 2021-08-22
          • 1970-01-01
          • 2011-11-25
          • 2011-05-05
          相关资源
          最近更新 更多