Checkstyle Javaルール

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

AnnotationUseStyle

CheckStyle公式ドキュメント

検証環境

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


チェック概要

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

アノテーションの属性のスタイルをチェックする。
スタイルの設定に関わるオプションには以下の3つが存在する。

  • ElementStyleOption
  • ClosingParensOption
  • TrailingArrayCommaOption

ElementStyleOption

アノテーションの属性の記述方法を定義するためのスタイルのポリシー。

説明
expanded アノテーションの属性を名前付きパラメータで記述する
compact 属性がvalueのみ、もしくはvalue以外の全ての属性がデフォルト値を持つ場合にのみ使用可能で、属性名を省略して記述する
compact_no_array compactと似ているが、属性に要素が1つのみの配列を記述する場合に{}を記述しない
ignore アノテーションの属性の記述方法はチェックしない
// expanded
// OK
@SuppressWarnings(value = {"unchecked","unused",})

// NG:属性名を省略しない
@SuppressWarnings({"unchecked","unused",})

// compact
// OK
@SuppressWarnings({"unchecked","unused",})
@SuppressWarnings("unchecked")

// NG:属性名がvalueのもののみ指定する場合は、属性名を省略する
@SuppressWarnings(value = {"unchecked","unused",})
@SuppressWarnings(value = "unchecked")

// compact_no_array
// OK
@SuppressWarnings("unchecked")
@MyAnnotation(someArray = "some value")

// NG:属性に指定する配列の要素数が1の場合に{}を記述しない
@SuppressWarnings({"unchecked"})
@MyAnnotation(someArray = {"some value"})

ClosingParensOption

アノテーションの終了括弧のスタイルに関するポリシー。

説明
always 属性値の有無に関わらず常に括弧を記述する
例:@Deprecated()
never 属性値を設定しない場合は括弧を記述しない
例:@Deprecated
ignore アノテーションの括弧についてチェックを行わない

TrailingArrayCommaOption

配列の末尾のコンマのスタイルに関するポリシー。

説明
always 配列の要素の末尾に常にコンマを記述する
例:@SuppressWarnings(value={"unchecked","unused",})
never 配列の要素の末尾にコンマを記述しない
例:@SuppressWarnings(value={"unchecked","unused"})
ignore 配列の末尾のコンマの有無をチェックしない

プロパティ

プロパティ デフォルト値 説明 追加バージョン
elementStyle ElementStyleOption compact_no_array アノテーションの属性の記述方法のスタイル 5.0
closingParens ClosingParensOption never 終了括弧に関するポリシー 5.0
trailingArrayComma TrailingArrayCommaOption never 配列の末尾のコンマに関するポリシー 5.0

設定+チェック実行結果

プロパティ設定なし

設定ファイル記述方法

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

チェック実行例

public class MyClass {
    // OK
    @Deprecated    
    // NG 配列の要素が1つだけなので{}は不要
    @SomeArrays(pooches = { DOGS.LEO })
    // NG 配列の要素が1つだけなので{}は不要
    @SuppressWarnings({ "" })
    public class TestOne {
    }

    // NG  配列の要素が1つだけなので{}は不要
    @SomeArrays(pooches = { DOGS.LEO }, um = {}, test = { "bleh" })
    // OK
    @SuppressWarnings("")
    // NG 括弧不要
    @Deprecated()
    class TestTwo {
    }
}

プロパティ設定あり

elementStyle

アノテーションの属性の記述方法のスタイルを設定する。

設定ファイル記述方法

<module name="Checker">
    <module name="TreeWalker">
        <module name = "AnnotationUseStyle">
            <property name="elementStyle" value="expanded"/>
        </module>
    </module>
</module>

チェック実行例

elementStyleに「expanded」を設定しているので、属性名は省略しない。

public class MyClass {
    // OK
    @Deprecated    
    // OK
    @SomeArrays(pooches = { DOGS.LEO })
    // NG 属性名は省略しない
    @SuppressWarnings({ "" })
    public class TestOne {
    }

    // OK
    @SomeArrays(pooches = { DOGS.LEO }, um = {}, test = { "bleh" })
    // NG 属性名は省略しない
    @SuppressWarnings("")
    // NG 括弧不要
    @Deprecated()
    class TestTwo {
    }
}

trailingArrayComma

終了括弧に関するポリシーを設定する。

設定ファイル記述方法

<module name="Checker">
    <module name="TreeWalker">
        <module name = "AnnotationUseStyle">
            <property name="trailingArrayComma" value="always"/>
        </module>
    </module>
</module>

チェック実行例

trailingArrayCommaに「always」を設定しているので、終了括弧を常に記述する。

public class MyClass {
    // NG 括弧を記述する
    @Deprecated    
    // NG 配列の要素が1つだけなので{}は不要
    @SomeArrays(pooches = { DOGS.LEO })
    // NG 配列の要素が1つだけなので{}は不要
    @SuppressWarnings({ "" })
    public class TestOne {
    }

    // NG  配列の要素が1つだけなので{}は不要
    @SomeArrays(pooches = { DOGS.LEO }, um = {}, test = { "bleh" })
    // OK
    @SuppressWarnings("")
    // OK
    @Deprecated()
    class TestTwo {
    }
}

closingParens

配列の末尾のコンマに関するポリシーを設定する。

設定ファイル記述方法

<module name="Checker">
    <module name="TreeWalker">
        <module name = "AnnotationUseStyle">
            <property name="closingParens" value="always"/>
        </module>
    </module>
</module>

チェック実行例

closingParensに「always」を設定しているので要素の末尾にコンマを記載する。

public class MyClass {
    // OK
    @Deprecated    
    // NG 配列の要素の末尾にコンマを記載する
    @SomeArrays(pooches = { DOGS.LEO })
    // NG 配列の要素の末尾にコンマを記載する
    @SuppressWarnings({ "" })
    public class TestOne {
    }

    // NG  配列の要素の末尾にコンマを記載する
    @SomeArrays(pooches = { DOGS.LEO }, um = {}, test = { "bleh" })
    // OK
    @SuppressWarnings("")
    // NG 括弧不要
    @Deprecated()
    class TestTwo {
    }
}

AnnotationOnSameLine

CheckStyle公式ドキュメント

検証環境

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


チェック概要

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

アノテーションと対象要素が同じ行にあることをチェックする。

プロパティ

プロパティ デフォルト値 説明 追加
バージョン
tokens トークンの サブセット CLASS_DEF,
INTERFACE_DEF,
ENUM_DEF,
METHOD_DEF,
CTOR_DEF,
VARIABLE_DEF,
RECORD_DEF,
COMPACT_CTOR_DEF
チェック対象のトーク 8.2

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

説明
ANNOTATION_DEF アノテーション宣言
ANNOTATION_FIELD_DEF アノテーションフィールドの宣言
CLASS_DEF クラス宣言
COMPACT_CTOR_DEF 引数なしコンストラクタ宣言
CTOR_DEF コンストラクター宣言
DOT .
ENUM_DEF enum宣言
IMPLEMENTS_CLAUSE implements
INTERFACE_DEF インターフェイス宣言
LITERAL_NEW new
LITERAL_THROWS throws
METHOD_DEF メソッド宣言
PARAMETER_DEF パラメータ宣言
RECORD_DEF レコード宣言
TYPECAST 型キャスト
TYPE_ARGUMENT 型参照またはメソッド/コンストラクタ呼び出しの型パラメータ
VARIABLE_DEF フィールドまたはローカル変数の宣言

設定+チェック実行結果

プロパティ設定なし

設定ファイル記述方法

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

チェック実行例

public class MyClass {
    // OK
    @Deprecated public void bar() {
    }

    // OK
    @Before @Override public void bar() {
    }

    // NG アノテーションは対象要素と同行に記述する
    @Override
    public void bar() {
    }

    // NG アノテーションは対象要素と同行に記述する
    @SuppressWarnings("deprecation")
    @Before public void bar() {
    }
}

プロパティ設定あり

tokens

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

設定ファイル記述方法

<module name="Checker">
    <module name="TreeWalker">
        <module name = "AnnotationOnSameLine">
            <property name = "tokens" value = "CLASS_DEF" />
        </module>
    </module>
</module>

チェック実行例

public class MyClass {
    // OK メソッド宣言はチェック対象外
    @Deprecated public void bar() {
    }

    // OK メソッド宣言はチェック対象外
    @Before @Override public void bar() {
    }

    // OK メソッド宣言はチェック対象外
    @Override
    public void bar() {
    }

    // OK メソッド宣言はチェック対象外
    @SuppressWarnings("deprecation")
    @Before public void bar() {
    }
}

AnnotationLocation

CheckStyle公式ドキュメント

検証環境

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


チェック概要

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

アノテーションの位置をチェックする。デフォルトでは以下の項目をチェックする。

※ローカル変数のようなJavaDocコメントを持つことができない要素は、トークンタイプの指定で対象としている場合でも、チェックの対象範囲には含まれないので注意する。

※以下のようにアノテーションがアクセス修飾子と戻り値の型の間に配置されている場合もチェックの対象外となる。

public @Nullable Long getStartTimeOrNull() {
}

プロパティ

プロパティ デフォルト値 説明 追加
バージョン
allowSameline MultipleAnnotations boolean false 複数のアノテーションを対象要素と同じ行に配置することを許容するかどうか 6.0
allowSamelineSingle ParameterlessAnnotation boolean true 1つの属性なしアノテーションを対象要素と同じ行に配置することを許容するかどうか 6.1
allowSameline ParameterizedAnnotation boolean false 属性ありのアノテーションを1つだけ対象要素と同じ行に配置することを許容するかどうか 6.4
tokens トークンの サブセット CLASS_DEF,
INTERFACE_DEF,
PACKAGE_DEF,
ENUM_CONSTANT_DEF,
ENUM_DEF,
METHOD_DEF,
CTOR_DEF,
VARIABLE_DEF,
RECORD_DEF,
COMPACT_CTOR_DEF
チェック対象のトーク 6.0

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

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

設定+チェック実行結果

プロパティ設定なし

設定ファイル記述方法

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

チェック実行例

public class MyClass {
    // OK 属性なしアノテーション1つまでなら同行に記載可能
    @NotNull private boolean field1;

    // OK
    @NotNull
    private boolean field2;

    // NG 属性ありアノテーションは同行に記述しない
    @SuppressWarnings("deprecation") DataLoader loader;

    // NG 属性なしアノテーションは同行に1つのみ記述できる
    @NotNull @Mock DataLoader loader;

    // OK 属性なしアノテーション1つまでなら同行に記載可能
    @Override public int hashCode() {
        return 1;
    }

    // OK
    @Override
    public boolean equals(Object obj) {
        return true;
    }

    // NG 属性ありアノテーションは同行に記述しない
    @SuppressWarnings("deprecation") public int foo() {
        return 1;
    }
}

プロパティ設定あり

allowSamelineMultipleAnnotations

trueの場合、複数のアノテーションを対象要素と同じ行に配置することができる。(デフォルト:false)

設定ファイル記述方法

<module name="Checker">
    <module name="TreeWalker">
        <module name = "AnnotationLocation">
            <property name = "allowSamelineMultipleAnnotations" value = "true" />
        </module>
    </module>
</module>

チェック実行例

アノテーションを同行に複数記述しても構わないので、以下の記述は全てチェックOKとなる。

public class MyClass {
    // OK 
    @NotNull private boolean field1;

    // OK
    @NotNull
    private boolean field2;

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

    // OK 
    @NotNull @Mock DataLoader loader;
    
    // OK 
    @Override public int hashCode() {
        return 1;
    }

    // OK
    @Override
    public boolean equals(Object obj) {
        return true;
    }

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

allowSamelineSingleParameterlessAnnotation

trueの場合、1つの属性なしアノテーションを対象要素と同じ行に配置できる。(デフォルト:true)

設定ファイル記述方法

<module name="Checker">
    <module name="TreeWalker">
        <module name = "AnnotationLocation">
            <property name = "allowSamelineSingleParameterlessAnnotation" value = "false" />
        </module>
    </module>
</module>

チェック実行例

アノテーションアノテーションの対象要素が同行に記載する場合チェックNGとなる。

public class MyClass {
    // NG アノテーションは同行に記述しない
    @NotNull private boolean field1;

    // OK
    @NotNull
    private boolean field2;

    // NG アノテーションは同行に記述しない
    @SuppressWarnings("deprecation") DataLoader loader;

    // NG アノテーションは同行に記述しない
    @NotNull @Mock DataLoader loader;
    
    // NG アノテーションは同行に記述しない
    @Override public int hashCode() {
        return 1;
    }

    // OK
    @Override
    public boolean equals(Object obj) {
        return true;
    }

    // NG アノテーションは同行に記述しない
    @SuppressWarnings("deprecation") public int foo() {
        return 1;
    }
}

allowSamelineParameterizedAnnotation

trueの場合、属性ありのアノテーションを1つだけ対象要素と同じ行に記載できる。(デフォルト:false)

設定ファイル記述方法

<module name="Checker">
    <module name="TreeWalker">
        <module name = "AnnotationLocation">
            <property name = "allowSamelineParameterizedAnnotation" value = "true" />
        </module>
    </module>
</module>

チェック実行例

属性の有無に関わらず、アノテーションは対象要素と同行に1つまでなら記載可能となる。

public class MyClass {
    // OK 属性なしアノテーション1つまでなら同行に記載可能
    @NotNull private boolean field1;

    // OK
    @NotNull
    private boolean field2;

    // OK 属性ありアノテーション1つまでなら同行に記載可能
    @SuppressWarnings("deprecation") DataLoader loader;

    // NG 属性なしアノテーションは同行に1つのみ記述できる
    @NotNull @Mock DataLoader loader;
    
    // OK 属性なしアノテーション1つまでなら同行に記載可能
    @Override public int hashCode() {
        return 1;
    }

    // OK
    @Override
    public boolean equals(Object obj) {
        return true;
    }

    // OK 属性ありアノテーション1つまでなら同行に記載可能
    @SuppressWarnings("deprecation") public int foo() {
        return 1;
    }
}

tokens

チェック対象のトークンをコンマ区切りで記述する。
※ローカル変数のようなJavaDocコメントを持つことができない要素は、トークンタイプの指定で対象としている場合でも、チェックの対象範囲には含まれないので注意する

設定ファイル記述方法

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

チェック実行例

public class MyClass {
    // OK メソッド宣言のみチェック対象なのでチェック対象外
    @NotNull private boolean field1;

    // OK メソッド宣言のみチェック対象なのでチェック対象外
    @NotNull
    private boolean field2;

    // OK メソッド宣言のみチェック対象なのでチェック対象外
    @SuppressWarnings("deprecation") DataLoader loader;

    // OK メソッド宣言のみチェック対象なのでチェック対象外
    @NotNull @Mock DataLoader loader;
    
    // OK 属性なしアノテーション1つまでなら同行に記載可能
    @Override public int hashCode() {
        return 1;
    }

    // OK
    @Override
    public boolean equals(Object obj) {
        return true;
    }

    // NG 属性ありアノテーションは同行に記述しない
    @SuppressWarnings("deprecation") public int foo() {
        return 1;
    }
}

トークンによって、プロパティの設定を切り替えたい場合は、以下のように設定を2つ記述することで対応可能となる。

<module name="Checker">
    <module name="TreeWalker">
        <module name = "AnnotationLocation">
            <property name="id" value="AnnotationLocationForMethodDef"/>
            <property name = "tokens" value = "METHOD_DEF" />
            <property name = "allowSamelineSingleParameterlessAnnotation" value = "false" />
        </module>
        <module name = "AnnotationLocation">
            <property name="id" value="AnnotationLocationForClassDef"/>
            <property name = "tokens" value = "CLASS_DEF" />
        </module>
    </module>
</module>