Checkstyle Javaルール

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

FinalLocalVariable

CheckStyle公式ドキュメント

検証環境

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


チェック概要

値が変更されることのないローカル変数がfinalで宣言されているかどうかをチェックする。
変更されないパラメータがfinalと宣言されているかどうかもチェックするように設定することができる。
パラメータをチェックするように設定した場合、インターフェースや抽象クラスの抽象メソッドのパラメータは無視される。

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

プロパティ

プロパティ デフォルト値 説明 追加バージョン
validateEnhancedForLoopVariable boolean false 拡張for文の変数をチェックするかどうか 6.5
tokens トークンのサブセット VARIABLE_DEF チェック対象のトーク 3.2

トークンのサブセットには以下の値が設定可能

説明
PARAMETER_DEF パラメータ宣言
VARIABLE_DEF ローカル変数・フィールド宣言

設定+チェック実行結果

プロパティ設定なし

設定ファイル記述方法

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

チェック実行例

public class MyClass {
    // OK パラメータはチェック対象外
    static int foo(int x, int y) {
        return x + y;
    }
  
    public static void main (String []args) {
        // OK 拡張for文の変数はチェック対象外
        for (String i : args) {
            System.out.println(i);
        }
        // NG resultは値が変更されないのでfinalを付与する
        int result = foo(1, 2);
    }
}

プロパティ設定あり

validateEnhancedForLoopVariable

trueを設定した場合、拡張for文の変数をチェックする(デフォルト:false)

設定ファイル記述方法

<module name="Checker">
    <module name="TreeWalker">
        <module name="FinalLocalVariable">
            <property name="validateEnhancedForLoopVariable" value="true"/>
        </module>
    </module>
</module>

チェック実行例

public class MyClass {
    // OK パラメータはチェック対象外
    static int foo(int x, int y) {
        return x + y;
    }
  
    public static void main (String []args) {
        // NG 「validateEnhancedForLoopVariable=true」なので
        // finalがないとチェックNG
        for (String i : args) {
            System.out.println(i);
        }
        // NG resultは値が変更されないのでfinalを付与する
        int result = foo(1, 2);
    }
}

tokens

チェック対象のトークンをコンマ区切りで指定する。

設定ファイル記述方法

<module name="Checker">
    <module name="TreeWalker">
        <module name="FinalLocalVariable">
            <property name="tokens" value="VARIABLE_DEF,PARAMETER_DEF"/>
        </module>
    </module>
</module>

チェック実行例

public class MyClass {
    // NG パラメータもチェック対象なので、変更されない場合はfinalを付与する
    static int foo(int x, int y) {
        return x + y;
    }
  
    public static void main (String []args) {
        // OK 拡張for文の変数はチェック対象外
        for (String i : args) {
            System.out.println(i);
        }
        // NG resultは値が変更されないのでfinalを付与する
        int result = foo(1, 2);
    }
}