Checkstyle チェック項目ーModifiers

Checkstyleチェック項目:Modifiers

CheckStyle公式ドキュメント

ver 10.3.1

ClassMemberImpliedModifier

クラスおよびレコードのネストされた型に対する暗黙の修飾子をチェックする。
クラスやレコードのネストされた型の修飾子をチェックし、特定の修飾子が実際には冗長であっても明示的に指定されていることを確認する。

プロパティ

プロパティ デフォルト値 説明
violateImpliedStaticOnNestedEnum boolean true クラスやレコードのネストされたenumに対して static を明示的にコード化することを強制するかどうか
violateImpliedStaticOnNestedInterface boolean true クラスやレコードのネストしたインターフェースにstaticを明示的にコード化することを強制するかどうか
violateImpliedStaticOnNestedRecord boolean true クラスやレコードのネストしたレコードにstaticを明示的にコード化することを強制するかどうか

チェック設定例

プロパティ設定なし

<module name="ClassMemberImpliedModifier" />

プロパティ設定あり

<module name="ClassMemberImpliedModifier">
    <property name="violateImpliedStaticOnNestedEnum" value="false"/>
    <property name="violateImpliedStaticOnNestedInterface" value="false"/>
    <property name="violateImpliedStaticOnNestedRecord" value="false"/>
</module>

チェック実行例

プロパティ設定なし

public final class Person {
    // OK
    static interface Address1 {
    }

    // NG staticを明示的に記述する
    interface Address2 {
    }

    // OK
    static enum Age1 {
        CHILD, ADULT
    }

    // NG staticを明示的に記述する
    enum Age2 {
        CHILD, ADULT
    }

    // OK
    public static record GoodRecord() {}
    // NG staticを明示的に記述する
    public record BadRecord() {}
}

プロパティ設定あり

public final class Person {
    // OK
    static interface Address1 {
    }

    // OK 「violateImpliedStaticOnNestedInterface=false」なのでstaticの記述は強制ではない
    interface Address2 {
    }

    // OK
    static enum Age1 {
        CHILD, ADULT
    }

    // OK 「violateImpliedStaticOnNestedEnum=false」なのでstaticの記述は強制ではない
    enum Age2 {
        CHILD, ADULT
    }

    // OK
    public static record GoodRecord() {}
    // OK 「violateImpliedStaticOnNestedRecord=false」なのでstaticの記述は強制ではない
    public record BadRecord() {}
}

InterfaceMemberImpliedModifier

インターフェイスメンバーとネストされた型に対する暗黙の修飾子をチェックする。
インターフェイスメンバーの修飾子をチェックし、特定の修飾子が実際には重複しているにもかかわらず明示的に指定されていることを確認する。

プロパティ

プロパティ デフォルト値 説明
violateImpliedPublicField boolean true インターフェイスフィールドに明示的にpublicがコード化されていることを強制するかどうか
violateImpliedStaticField boolean true インターフェイスフィールドにstaticを明示的にコード化することを強制するかどうか
violateImpliedFinalField boolean true インターフェイスフィールドに明示的にfinalをコード化することを強制するかどうか
violateImpliedPublicMethod boolean true インターフェイスメソッドに明示的にpublicを記述することを強制するかどうか
violateImpliedAbstractMethod boolean true インターフェイスメソッドに abstract を明示的にコード化することを強制するかどうか
violateImpliedPublicNested boolean true インターフェイスのネストした型に public を明示的にコード化することを強制するかどうか
violateImpliedStaticNested boolean true インターフェイスのネストされた型に staticを明示的にコード化することを強制するかどうか

チェック設定例

プロパティ設定なし

<module name="InterfaceMemberImpliedModifier"/>

プロパティ設定あり

<module name="InterfaceMemberImpliedModifier">
    <property name="violateImpliedPublicField" value="false"/>
    <property name="violateImpliedStaticField" value="false"/>
</module>

チェック実行例

プロパティ設定なし

public interface AddressFactory {
    // OK
    public static final String UNKNOWN = "Unknown";

    // NG 明示的にpublic static finalと記述する
    String OTHER = "Other";

    // OK
    public static AddressFactory instance();

    // OK
    public abstract Address createAddress(String addressLine, String city); 

    // NG 明示的にpublic abstractと記述する
    List<Address> findAddresses(String city);

    // NG 明示的にpublic staticと記述する
    interface Address {
        // NG 明示的にpublic static finalと記述する
        String getCity();
    }
}

プロパティ設定あり

public interface AddressFactory {
    // OK
    public static final String UNKNOWN = "Unknown";

    // OK 「violateImpliedPublicField=false」なのでpublicの記述は強制ではない
    // OK 「violateImpliedStaticField=false」なのでstaticの記述は強制ではない
    String OTHER = "Other";

    // OK
    public static AddressFactory instance();

    // OK
    public abstract Address createAddress(String addressLine, String city); 

    // NG 明示的にpublic abstractと記述する
    List<Address> findAddresses(String city);

    // NG 明示的にpublic staticと記述する
    interface Address {
        // NG 明示的にpublic static finalと記述する
        String getCity();
    }
}

ModifierOrder

修飾子の順序がJava言語仕様に準拠しているかをチェックする。
正しい順序は以下の通り。

  1. public
  2. protected
  3. private
  4. abstract
  5. default
  6. static
  7. sealed
  8. non-sealed
  9. final
  10. transient
  11. volatile
  12. synchronized
  13. native
  14. strictfp

プロパティ

なし

チェック設定例

<module name="ModifierOrder"/>

RedundantModifier

冗長な修飾子をチェックする。

チェック内容は以下の通り

  • インターフェースとアノテーションの定義
  • finalクラスおよび匿名クラスのメソッドに対するfinal修飾子
  • publicまたはstaticと宣言されたインターフェースの下にネストされた型宣言
  • クラスのコンストラク
  • staticと宣言されたenumの定義を入れ子にしたもの
  • Finalと宣言されたレコード定義と、staticと宣言されたネストされたレコード定義

プロパティ

プロパティ デフォルト値 説明
tokens トークンの サブセット METHOD_DEF, VARIABLE_DEF, ANNOTATION_FIELD_DEF, INTERFACE_DEF, CTOR_DEF, CLASS_DEF, ENUM_DEF, RESOURCE, ANNOTATION_DEF, RECORD_DEF チェック対象のトーク

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

トーク 説明
METHOD_DEF メソッド宣言
VARIABLE_DEF フィールドまたはローカル変数の宣言
ANNOTATION_FIELD_DEF アノテーションフィールドの宣言
INTERFACE_DEF インターフェイス宣言
CLASS_DEF クラス宣言
CTOR_DEF コンストラクター宣言
ENUM_DEF 列挙型宣言
ANNOTATION_DEF アノテーション宣言
RECORD_DEF レコード宣言
RESOURCE try-with-resources

チェック設定例

プロパティ設定なし

<module name="RedundantModifier"/>

プロパティ設定あり

<module name="RedundantModifier">
    <property name="tokens" value="CLASS_DEF"/>
</module>

チェック実行例

プロパティ設定なし

public interface MyInterface {
    // NG
    public abstract void foo();
}

プロパティ設定あり

public interface MyInterface {
    // OK メソッド宣言はチェック対象外
    public abstract void foo();
}