Checkstyle Javaルール

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

EmptyBlock

CheckStyle公式ドキュメント

検証環境

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


チェック概要

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

空のブロックがないかチェックする。
以下のようなシーケンシャルブロックはチェック対象外となる。また、フォールスルーの検出も行われない。

switch (a) {
  case 1:
  case 2:
  case 3: someMethod(); {}
  default: break;
}

ブロックが空かどうかの判定にはBlockOptionを指定する。

説明
text ブロック内にテキスト(コメントでも可)があることを要求する
statement ブロック内にステートメント(コメント不可)があることを要求する
// text
// OK
catch (Exception ex) {
    // コメント
}

// NG
catch (Exception ex) {
}

// statement
// OK
catch (Exception ex) {
    ex.printStackTrace();
}

// NG
catch (Exception ex) {
    // コメント
}

プロパティ

プロパティ デフォルト値 説明 追加バージョン
option BlockOption statement ブロックの内容に関するポリシー 3.0
tokens トークンの サブセット LITERAL_WHILE,
LITERAL_TRY,
LITERAL_FINALLY,
LITERAL_DO,
LITERAL_IF,
LITERAL_ELSE,
LITERAL_FOR,
INSTANCE_INIT,
STATIC_INIT,
LITERAL_SWITCH,
LITERAL_SYNCHRONIZED
チェック対象のトーク 3.0

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

説明
ARRAY_INIT 配列の初期化
INSTANCE_INIT インスタンスイニシャライザ
LITERAL_CASE case
LITERAL_CATCH catch
LITERAL_DEFAULT default
LITERAL_DO do
LITERAL_ELSE else
LITERAL_FINALLY finally
LITERAL_FOR for
LITERAL_IF if
LITERAL_SWITCH switch
LITERAL_SYNCHRONIZED synchronized
LITERAL_TRY try
LITERAL_WHILE while
STATIC_INIT スタティックイニシャライザ

設定+チェック実行結果

プロパティ設定なし

設定ファイル記述方法

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

チェック実行例

public class MyClass {
    private void foo() {
        // NG forブロック内部に処理が何もない
        for (int i = 0; i < 10; i++) {
        }

        // NG tryブロック内部に処理が何もない
        try {
        // OK デフォルトではcatchはチェック対象外
        } catch (Exception e) {
            // コメント
        }
    }
}

プロパティ設定あり

option

ブロックの内容に関するポリシーを設定する。
デフォルトではブロック内にステートメント(コメントのみはNG)を必要とする設定となっている。

設定ファイル記述方法

<module name="Checker">
    <module name="TreeWalker">
        <module name="EmptyBlock">
            <property name="option" value="text"/>
        </module>
    </module>
</module>

チェック実行例

public class MyClass {
    private void foo() {
        // OK 「option=text」のため、コメントが記載してあればOK
        for (int i = 0; i < 10; i++) {
            // コメント
        }

        // NG tryブロック内部に処理もコメントもない
        try {
        } catch (Exception e) { // OK デフォルトではcatchはチェック対象外
            // コメント
        }
    }
}

tokens

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

設定ファイル記述方法

<module name="Checker">
    <module name="TreeWalker">
        <module name="EmptyBlock">
            <property name="tokens" value="LITERAL_TRY,LITERAL_CATCH"/>
        </module>
    </module>
</module>

チェック実行例

public class MyClass {
    private void foo() {
        // OK プロパティによりチェック対象外
        for (int i = 0; i < 10; i++) {
        }

        // NG tryブロック内部に処理が何もない
        try {
        // NG catchブロック内部に処理が何もない
        } catch (Exception e) {
            // コメント
        }
    }
}

AvoidNestedBlocks

CheckStyle公式ドキュメント

検証環境

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


チェック概要

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

ネストされたブロック(コード内で自由に使用されているブロック)がないかどうかをチェックする。

switch文のcaseはブロックを形成していないため、caseスコープを持つローカル変数を宣言するには、ネストされたブロックを記述する必要がある。
しかし、デフォルトの設定ではネストしたブロックはこのチェックで検出されてしまう。
allowInSwitchCaseプロパティをtrueに設定することでswitchのcase内のブロックを記述することができるようになる。

プロパティ

プロパティ デフォルト値 説明 追加バージョン
allowInSwitchCase boolean false switchのcase内のブロックを許可するかどうか 3.2

設定+チェック実行結果

プロパティ設定なし

設定ファイル記述方法

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

チェック実行例

public class MyClass {
    public void foo() {
        int myInteger = 0;

        // NG
        {
            myInteger = 2;
        }

        System.out.println("myInteger = " + myInteger);

        switch (a) {
            case 1:
                // NG
                {
                    System.out.println("Case 1");
                    break;
                }
            case 2:
                System.out.println("Case 2");
                break;
        }
    }
}

プロパティ設定あり

allowInSwitchCase

trueを設定した場合、switchのcase内にブロックを記述することができる。

設定ファイル記述方法

<module name="Checker">
    <module name="TreeWalker">
        <module name="AvoidNestedBlocks">
            <property name="allowInSwitchCase" value="true"/>
        </module>
    </module>
</module>

チェック実行例

public class MyClass {
    public void foo() {
        int myInteger = 0;

        // NG
        {
            myInteger = 2;
        }

        System.out.println("myInteger = " + myInteger);

        switch (a) {
            case 1:
                // OK 「allowInSwitchCase=true」なのでcaseの中にブロックを記述可能
                {
                    System.out.println("Case 1");
                    break;
                }
            case 2:
                System.out.println("Case 2");
                break;
        }
    }
}

SuppressWarningsHolder

CheckStyle公式ドキュメント

検証環境

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


チェック概要

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

SuppressWarningsアノテーションを使用して、Checkstyleのチェック抑制を許可するチェックのセットを保持する。
これにより、@SuppressWarningsと除外するチェックの名前を使用してアノテーションが付与されたコードの部分から、Checkstyleが違反を報告するのを防ぐ。

SuppressWarningsアノテーションの引数に「all」を指定することで、全てのCheckstyleの警告を抑制することができる。
また、「checkstyle:」というプレフィックスをつけることで、コンパイラがこれらのアノテーションを処理しないようにすることもできる。
また、チェックを抑制させたいチェック名のエイリアスを定義することも可能。

@SuppressWarningsの引数とチェックのクラス名とのマッチングは、アルファベットの大文字と小文字の区別なく行われる。「check」のサフィックスを付加していてもマッチングされる。

プロパティ

プロパティ デフォルト値 説明 追加バージョン
aliasList カンマで区切られた「属性=値」で構成されるString[]
属性はCheckの完全修飾名で、値はその別名
null SuppressWarnings内のコードで使用できるチェック名のエイリアス 5.7

設定+チェック実行結果

プロパティ設定なし

設定ファイル記述方法

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

チェック実行例

// MemberNameCheckを抑制する例
@SuppressWarnings({"membername"})
private int J;

checkstyleプレフィックスを使用した場合でも、コンパイラがこれらのアノテーションを処理しないようにすることができる。

// ConstantNameCheckを抑制する例
@SuppressWarnings("checkstyle:constantname")
private static final int m = 0;

プロパティ設定あり

aliasList

SuppressWarnings内のコードで使用できるチェック名のエイリアスを「属性=値」形式でコンマ区切りで指定する。 属性はCheckの完全修飾名、値は別名を記述する。

設定ファイル記述方法

<module name="Checker">
    <module name="TreeWalker">
        <module name="SuppressWarningsHolder">
            <property name="aliasList" value="com.puppycrawl.tools.checkstyle.checks.sizes.ParameterNumberCheck=paramnum"/>
        </module>
    </module>
</module>

チェック実行例

設定ファイルで記載したエイリアスを記述して、特定のチェックを抑制することができる。

// ParameterNumberCheckを抑制する例
@SuppressWarnings("paramnum")
public void needsLotsOfParameters(@SuppressWarnings("unused") int a, int b, int c, int d, int e, int f, int g, int h) {
}

SuppressWarnings

CheckStyle公式ドキュメント

検証環境

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


チェック概要

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

SuppressWarningsが抑制できない警告を指定する。
設定された警告を抑制できないトークンのリストを指定することもできる。
このチェックでは、@SuppressWarningsアノテーションの属性内に記述された条件文は考慮されない。

デフォルトではtokensプロパティによって指定されない限り、全てのトークンでSuppressWarningsでの警告抑制が禁止される。

プロパティ

プロパティ デフォルト値 説明 追加バージョン
format Pattern "^\s*+$" 警告抑制を禁止させたい正規表現 5.0
tokens トークンの サブセット CLASS_DEF,
INTERFACE_DEF,
ENUM_DEF,
ANNOTATION_DEF,
ANNOTATION_FIELD_DEF,
ENUM_CONSTANT_DEF,
PARAMETER_DEF,
VARIABLE_DEF,
METHOD_DEF,
CTOR_DEF,
COMPACT_CTOR_DEF,
RECORD_DEF
チェック対象のトーク 5.0

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

説明
ANNOTATION_DEF アノテーション宣言
ANNOTATION_FIELD_DEF アノテーションフィールドの宣言
CLASS_DEF クラス宣言
COMPACT_CTOR_DEF 引数なしコンストラクタ宣言
CTOR_DEF コンストラクター宣言
ENUM_CONSTANT_DEF Enum定数宣言
ENUM_DEF enum宣言
INTERFACE_DEF インターフェイス宣言
METHOD_DEF メソッド宣言
PARAMETER_DEF パラメータ宣言
RECORD_DEF レコード宣言
VARIABLE_DEF フィールドまたはローカル変数の宣言

設定+チェック実行結果

プロパティ設定なし

設定ファイル記述方法

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

チェック実行例

デフォルトの設定ではSuppressWarningsで警告を抑制するとチェックNGとなる。

public class MyClass {
    // NG 
    @SuppressWarnings("unused") 
    DataLoader loader;

    // NG 
    @SuppressWarnings("unchecked")
    DataLoader loader;

    // NG 
    @SuppressWarnings("unused") 
    public int foo() {
        return 1;
    }
}

プロパティ設定あり

format

SuppressWarningsで警告抑制するのを許可しないパターンを指定する。

設定ファイル記述方法

<module name="Checker">
    <module name="TreeWalker">
        <module name = "SuppressWarnings">
            <property name="format" value="^unchecked$"/>
        </module>
    </module>
</module>

チェック実行例

uncheckedを抑制しているSuppressWarningsはチェックNGとなる。

public class MyClass {
    // OK 
    @SuppressWarnings("unused") 
    DataLoader loader;

    // NG 
    @SuppressWarnings("unchecked")
    DataLoader loader;

    // OK 
    @SuppressWarnings("unused") 
    public int foo() {
        return 1;
    }
}

tokens

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

設定ファイル記述方法

<module name="Checker">
    <module name="TreeWalker">
        <module name = "SuppressWarnings">
            <property name="tokens" value="METHOD_DEF"/>
        </module>
    </module>
</module>

チェック実行例

メソッド宣言のみがチェック対象となる。

public class MyClass {
    // OK 
    @SuppressWarnings("unused") 
    DataLoader loader;

    // OK
    @SuppressWarnings("unchecked")
    DataLoader loader;

    // NG 
    @SuppressWarnings("unused") 
    public int foo() {
        return 1;
    }
}

PackageAnnotation

CheckStyle公式ドキュメント

検証環境

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


チェック概要

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

全てのパッケージアノテーションpackage-info.javaファイルにあることをチェックする。
Java8以降では、package-info.javaファイルへのパッケージアノテーションの配置はコンパイラによって強制されるため、このチェックは不要。

設定+チェック実行結果

設定ファイル記述方法

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

チェック実行例

// OK:MyClass.java
package com.example.annotations.packageannotation;

public class MyClass{}

// OK:package-info.java
@Deprecated
package com.example.annotations.packageannotation;

// NG:MyClass.java パッケージへのアノテーションの付与はpackage-info.javaで行う
@Deprecated
package com.example.annotations.packageannotation;

public class MyClass{}

MissingOverride

CheckStyle公式ドキュメント

検証環境

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


チェック概要

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

アノテーション@OverrideJavadocタグの@inheritDocいずれかが存在する場合、それらの両方が存在することをチェックする。
無効なメソッド(例:プライベートメソッド、staticメソッド)で@inheritDocを使用すると、このチェックで違反となる。

Java5とJava6以降では、@Overrideアノテーションに若干の違いがある。
Java5では、インターフェイスからオーバーライドされたメソッドは@Overrideアノテーションを付けることができないが、Java6以降では許可されている。
Java5の@Overrideの動作でチェックを行いたい場合はプロパティ「javaFiveCompatibility」にtrueを設定する。このプロパティはJava5のソース上でのみ使用することを推奨する。

プロパティ

プロパティ デフォルト値 説明 追加バージョン
javaFiveCompatibility boolean false Java5互換モードを有効にするかどうか 5.0

設定+チェック実行結果

プロパティ設定なし

設定ファイル記述方法

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

チェック実行例

public class MyClass {
    // OK
    /** {@inheritDoc} */
    @Override
    public void test1(){
    }

    // NG @Overrideがない
    /** {@inheritDoc} */
    public void test2(){
    }

    // NG privateメソッドで{@inheritDoc}を使用している
    /** {@inheritDoc} */
    private void test3(){
    }

    // NG staticメソッドで{@inheritDoc}を使用している
    /** {@inheritDoc} */
    public static void test4(){
    }
}

プロパティ設定あり

javaFiveCompatibility

trueを設定した場合、Java5の@Overrideの動作でチェックを行う。

設定ファイル記述方法

<module name="Checker">
    <module name="TreeWalker">
        <module name = "MissingOverride">
            <property name="javaFiveCompatibility" value="true"/>
        </module>
    </module>
</module>

チェック実行例

プロパティはJava5使用時以外はtrueに設定するべきではないので省略。

MissingDeprecated

CheckStyle公式ドキュメント

検証環境

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


チェック概要

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

アノテーション@DeprecatedJavadocタグの@deprecatedいずれかが存在する場合、それらの両方が存在することをチェックする。

パッケージへの非推奨の記述はアノテーションJavadoc両方を必須としない例外的なものであるが、使用するJDKのバージョンによって、package-info.javaに記述したパッケージの@Deprecatedがエラーとなるか、チェックOKとなるかは異なる。

チェックとして検出したくない場合は、SuppressionSingleFilterでpackage-info.javaはチェック対象外となるように設定する。

以下はフィルターの記述例である。

<module name="SuppressionSingleFilter">
    <property name="checks" value="MissingDeprecatedCheck"/>
    <property name="files" value="package-info\.java"/>
</module>

プロパティ

プロパティ デフォルト値 説明 追加バージョン
violateExecutionOnNonTightHtml boolean false チェック対象のJavadocTight-HTML Rulesに違反している場合に違反の表示を制御するかどうか 8.24

設定+チェック実行結果

プロパティ設定なし

設定ファイル記述方法

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

チェック実行例

public class MyClass {
    // OK Javadocコメントがないためチェック対象外
    @Deprecated
    public static final int MY_CONST = 13;

    // OK
    /**
     * @deprecated
     * <p></p>
     */
    @Deprecated
    public static final int NUM = 123456;

    // OK
    /**
     * @deprecated
     *  <p>
     */
    @Deprecated
    public static final int CONST = 12;

    // NG Javadocに@deprecatedが必要
    /** This javadoc is missing deprecated tag. */
    @Deprecated
    public static final int COUNTER = 10;
}

プロパティ設定あり

violateExecutionOnNonTightHtml

trueを設定した場合、Javadoc内に記述したHTMLタグに不適切な使用方法をしているものがあった場合に検出する(デフォルト:false)。

設定ファイル記述方法

<module name="Checker">
    <module name="TreeWalker">
        <module name = "MissingDeprecated">
            <property name="violateExecutionOnNonTightHtml" value="true"/>
        </module>
    </module>
</module>

チェック実行例

public class MyClass {
    // OK Javadocコメントがないためチェック対象外
    @Deprecated
    public static final int MY_CONST = 13;

    // OK
    /**
     * @deprecated
     * <p></p>
     */
    @Deprecated
    public static final int NUM = 123456;

    // NG <p>の閉じタグがないとNG
    /**
     * @deprecated
     *  <p>
     */
    @Deprecated
    public static final int CONST = 12;

    // NG Javadocに@deprecatedが必要
    /** This javadoc is missing deprecated tag. */
    @Deprecated
    public static final int COUNTER = 10;
}