Checkstyle EmptyLineSeparator 忽略自定义标记

Checkstyle EmptyLineSeparator ignores custom tokens

我想要 EmptyLineSeparator 没有令牌 STATIC_INIT(我使用的是 8.36.2 版本)。

我的简单java-class:

package com.test;

public class Test {
    private static final int[] FIELD = new int[5];
    static {
        FIELD[0] = 16;
        FIELD[1] = 8;
        FIELD[2] = 6;
        FIELD[3] = 10;
        FIELD[4] = 10;
    }
}

我的checkstyle.xml:

<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
        "-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
        "https://checkstyle.org/dtds/configuration_1_3.dtd">

<module name="Checker">
    <module name="TreeWalker">
        <module name="EmptyLineSeparator">
            <property name="tokens"
            value="PACKAGE_DEF, IMPORT, STATIC_IMPORT, CLASS_DEF, INTERFACE_DEF, ENUM_DEF, INSTANCE_INIT,
            METHOD_DEF, CTOR_DEF, VARIABLE_DEF, RECORD_DEF, COMPACT_CTOR_DEF"/>
            <property name="allowNoEmptyLineBetweenFields" value="true"/>
            <property name="allowMultipleEmptyLines" value="false"/>
        </module>
    </module>
</module>

但仍然看到我的构建失败,因为:

/var/tmp $ java -jar checkstyle-8.36.2-all.jar -c config.xml Test.java
Starting audit...
[ERROR] /dev/tmp/Test.java:5:5:
   'STATIC_INIT' should be separated from previous statement. [EmptyLineSeparator]
Audit done.
Checkstyle ends with 1 errors.

我错过了什么吗? 我预计没有错误。

这里的问题是您从令牌列表中排除了 STATIC_INIT,但其中有 VARIABLE_DEF。 你的违规在现场检查时被报告是因为字段定义没有被分开。请注意,allowNoEmptyLineBetweenFields 标志在这里不适用,因为它仅适用于 字段之间的任何行,但这里有字段和静态初始化块。

当您从检查中排除 STATIC_INIT 标记时,这意味着 checkstyle 将不会检查此标记之后是否有内容,例如这样的代码不会造成违规

public class Test {
    private static final int[] FIELD = new int[5];

    static {
        FIELD[0] = 16;
        FIELD[1] = 8;
        FIELD[2] = 6;
        FIELD[3] = 10;
        FIELD[4] = 10;
    }
    private int myOtherField; // no violation
}