Checkstyle Javaルール

CheckstyleのJavaルールについて1つずつまとめます

DeclarationOrder

CheckStyle公式ドキュメント

検証環境

Checkstyleバージョン:10.3.3
Javaバージョン:17


チェック概要

チェック追加バージョン
Checkstyle 3.2

クラス、レコード、インタフェース宣言の各部分が、Javaプログラミング言語のコード規約で推奨される順序で表示されているかどうかをチェックする。

Javaプログラミング言語のコード規約によると、クラスやインターフェースの宣言は、次のような順序で記述することになっている。

  1. クラス(static)変数
    public, protected, パッケージプライベート, privateの順に記述
  2. インスタンス変数
    public, protected, パッケージプライベート, privateの順に記述
  3. コンストラク
  4. メソッド

ignoreオプションの目的は関連する違反を無視することだが、他のクラスメンバーには影響がある可能性がある。

※前方参照を持つクラスフィールドは、フィールドの位置とグループ化に関するユーザーの意図を明確に検出するためのCheckstyleの制限により、検証からスキップされる

public class A {
    private double x = 1.0;
    private double y = 2.0;
    // 前方参照のためチェック対象外
    public double slope = x / y;
}

プロパティ

プロパティ デフォルト値 説明 追加バージョン
ignoreConstructors boolean false コンストラクタを無視するかどうか 5.2
ignoreModifiers boolean false 修飾子を無視するかどうか 5.2

設定+チェック実行結果

プロパティ設定なし

設定ファイル記述方法

<module name="Checker">
    <module name="TreeWalker">
        <module name="DeclarationOrder"/>
    </module>
</module>

チェック実行例

public class MyClass {

    public int a;
    
    protected int b;
    
    // NG protectedなメンバ変数より上に記述するべき
    public int c;

    MyClass() {
        this.a = 0;
    }

    public void foo() {
    }

    // NG メソッドより上に記述するべき
    MyClass(int a) {
        this.a = a;
    }

    // NG メンバ変数はメソッド・コンストラクタより上に記述するべき
    private String name;
}

プロパティ設定あり

ignoreConstructors

trueを設定した場合、コンストラクタをチェック対象外とする(デフォルト:false)

設定ファイル記述方法

<module name="Checker">
    <module name="TreeWalker">
        <module name="DeclarationOrder">
            <property name="ignoreConstructors" value="true"/>
        </module>
    </module>
</module>

チェック実行例

public class MyClass {

    public int a;
    
    protected int b;
    
    // NG protectedなメンバ変数より上に記述するべき
    public int c;

    MyClass() {
        this.a = 0;
    }

    public void foo() {
    }

    // OK 「ignoreConstructors=true」なのでコンストラクタはチェックされない
    MyClass(int a) {
        this.a = a;
    }

    // NG メンバ変数はメソッド・コンストラクタより上に記述するべき
    private String name;
}

ignoreModifiers

trueを設定した場合、修飾子をチェック対象外とする(デフォルト:false)

設定ファイル記述方法

<module name="Checker">
    <module name="TreeWalker">
        <module name="DeclarationOrder">
            <property name="ignoreModifiers" value="true"/>
        </module>
    </module>
</module>

チェック実行例

public class MyClass {

    public int a;
    
    protected int b;
    
    // OK 「ignoreModifiers=true」なので修飾子の順番はチェックされない
    public int c;

    MyClass() {
        this.a = 0;
    }

    public void foo() {
    }

    // NG メソッドより上に記述するべき
    MyClass(int a) {
        this.a = a;
    }

    // NG メンバ変数はメソッド・コンストラクタより上に記述するべき
    private String name;
}