Checkstyle Javaルール

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

VisibilityModifier

CheckStyle公式ドキュメント

検証環境

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


チェック概要

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

クラスのメンバの可視性をチェックする。
static final、immutable、または指定されたアノテーションを持つメンバのみpublicとすることができ、その他のクラスメンバはprotectedAllowedプロパティまたはpackageAllowedプロパティが設定されていない限りprivateとするべきである。

publicMemberPattern(デフォルト:"^serialVersionUID$")に指定の正規表現に一致する場合は、チェック対象外となる。

この他にも、チェックの厳しさを緩和するためのプロパティも用意されている。

  • ignoreAnnotationCanonicalNames メンバに付与していた場合にチェック対象外とするアノテーションのリスト。単にアノテーション名のみを指定した場合、その型はパッケージを考慮せずに同じ名前のものにマッチングさせる
  • allowPublicFinalFields publicなfinalフィールドを許容する
  • allowPublicImmutableFields finalクラスで定義されている場合、immutableフィールドをpublicとして宣言することを許容する

フィールドは以下の場合にimmutableであることが知られている。

  • finalで宣言されている
  • プリミティブ型か、ユーザーが定義した不変のクラス(String、GuavaのImmutableCollectionなど)のインスタンスを持つ

immutableであることが分かっているクラスは、immutableClassCanonicalNamesプロパティに正規名でリストアップされている。

※このチェックではクラスがimmutableかどうかのチェックは行わない。現在のフィールドがimmutableかfinalかだけをチェックする。
allowPublicImmutableFieldsがtrueに設定されている場合、不変性を高めるために包含するクラスもfinalでなければならないが、allowPublicFinalFieldsがtrueに設定されている場合は、包含するクラスのfinal修飾子の有無は任意となる。

プロパティ

プロパティ デフォルト値 説明 追加バージョン
packageAllowed boolean false package-privateのメンバを許可するかどうか 3.0
protectedAllowed boolean false protectedのメンバを許可するかどうか 3.0
publicMember Pattern Pattern "^serialVersionUID$" チェック対象外とするpublicメンバの正規表現 3.0
allowPublic FinalFields boolean false finalフィールドをpublicとして宣言することを許可するかどうか 7.0
allowPublic ImmutableFields boolean false finalクラスで定義された場合、immutableフィールドをpublicとして宣言することを許可するかどうか 6.4
immutableClass CanonicalNames String[] java.io.File,
java.lang.Boolean,
java.lang.Byte,
java.lang.Character,
java.lang.Double,
java.lang.Float,
java.lang.Integer,
java.lang.Long,
java.lang.Short,
java.lang.StackTraceElement,
java.lang.String,
java.math.BigDecimal,
java.math.BigInteger,
java.net.Inet4Address,
java.net.Inet6Address,
java.net.InetSocketAddress,
java.net.URI,
java.net.URL,
java.util.Locale,
java.util.UUID
immutableクラスの正規名(コンマ区切りで複数指定可能) 6.4.1
ignoreAnnotation CanonicalNames String[] com.google.common .annotations.VisibleForTesting,
org.junit.ClassRule,
org.junit.Rule
メンバに付与していた場合にチェック対象外とするアノテーションの正規名(コンマ区切りで複数指定可能) 6.5

設定+チェック実行結果

プロパティ設定なし

設定ファイル記述方法

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

チェック実行例

class MyClass {
    // OK 「ignoreAnnotationCanonicalNames」に設定されたアノテーションが付与されているのでチェック対象外
    @org.junit.Rule
    public TemporaryFolder publicJUnitRule = new TemporaryFolder();
    
    // OK 「ignoreAnnotationCanonicalNames」に設定されたアノテーションが付与されているのでチェック対象外
    @org.junit.ClassRule
    public static TemporaryFolder publicJUnitClassRule = new TemporaryFolder();
    
    // NG publicでメンバを宣言しない
    public String testString = "";
    
    // OK
    private String str = "aaa";
}

プロパティ設定あり

packageAllowed

trueを設定した場合、パッケージプライベートなメンバを許可する(デフォルト:false)

設定ファイル記述方法

<module name="Checker">
    <module name="TreeWalker">
        <module name="VisibilityModifier">
            <property name="packageAllowed" value="true"/>
        </module>
    </module>
</module>

チェック実行例

class MyClass {
    // OK 「packageAllowed=true」なのでOK
    TemporaryFolder publicJUnitRule = new TemporaryFolder();
    
    // NG protectedでメンバを宣言しない
    protected static TemporaryFolder publicJUnitClassRule = new TemporaryFolder();
    
    // NG publicでメンバを宣言しない
    public String testString = "";
    
    // OK
    private String str = "aaa";
}

protectedAllowed

trueを設定した場合、protectedなメンバを許可する(デフォルト:false)

設定ファイル記述方法

<module name="Checker">
    <module name="TreeWalker">
        <module name="VisibilityModifier">
            <property name="protectedAllowed" value="true"/>
        </module>
    </module>
</module>

チェック実行例

class MyClass {
    // NG パッケージプライベートでメンバを宣言しない
    TemporaryFolder publicJUnitRule = new TemporaryFolder();
    
    // OK 「protectedAllowed=true」なのでOK
    protected static TemporaryFolder publicJUnitClassRule = new TemporaryFolder();
    
    // NG publicでメンバを宣言しない
    public String testString = "";
    
    // OK
    private String str = "aaa";
}

publicMemberPattern

チェック対象外とするpublicメンバの正規表現

設定ファイル記述方法

<module name="Checker">
    <module name="TreeWalker">
        <module name="VisibilityModifier">
            <property name="publicMemberPattern" value="^testString$"/>
        </module>
    </module>
</module>

チェック実行例

class MyClass {
    // NG パッケージプライベートでメンバを宣言しない
    TemporaryFolder publicJUnitRule = new TemporaryFolder();
    
    // NG protectedでメンバを宣言しない
    protected static TemporaryFolder publicJUnitClassRule = new TemporaryFolder();
    
    // OK 「VisibilityModifier」に設定されている値と合致するのでOK
    public String testString = "";
    
    // OK
    private String str = "aaa";
}

allowPublicFinalFields

trueを設定した場合、finalフィールドをpublicとして宣言することを許可する(デフォルト:false)

設定ファイル記述方法

<module name="Checker">
    <module name="TreeWalker">
        <module name="VisibilityModifier">
            <property name="allowPublicFinalFields" value="true"/>
        </module>
    </module>
</module>

チェック実行例

class MyClass {
    // NG パッケージプライベートでメンバを宣言しない
    TemporaryFolder publicJUnitRule = new TemporaryFolder();
    
    // NG protectedでメンバを宣言しない
    protected static TemporaryFolder publicJUnitClassRule = new TemporaryFolder();
    
    // OK 「allowPublicFinalFields=true」なのでOK
    public final String testString = "";
    
    // OK
    private String str = "aaa";
}

allowPublicImmutableFields

trueを設定した場合、finalクラスで定義されたimmutableフィールドをpublicとして宣言することを許可する

設定ファイル記述方法

<module name="Checker">
    <module name="TreeWalker">
        <module name="VisibilityModifier">
            <property name="allowPublicImmutableFields" value="true"/>
        </module>
    </module>
</module>

チェック実行例

class MyClass {
    // NG パッケージプライベートでメンバを宣言しない
    TemporaryFolder publicJUnitRule = new TemporaryFolder();
    
    // NG protectedでメンバを宣言しない
    protected static TemporaryFolder publicJUnitClassRule = new TemporaryFolder();
    
    // OK 「allowPublicImmutableFields=true」なのでOK
    public final String testString = "";
    
    // OK
    private String str = "aaa";
}

immutableClassCanonicalNames

immutableクラスの正規名(コンマ区切りで複数指定可能) allowPublicImmutableFieldsプロパティとセットで使用する

設定ファイル記述方法

<module name="Checker">
    <module name="TreeWalker">
        <module name="VisibilityModifier">
            <property name="allowPublicImmutableFields" value="true"/>
            <property name="immutableClassCanonicalNames" value="com.google.common.collect.ImmutableSet,java.lang.String"/>
        </module>
    </module>
</module>

チェック実行例

class MyClass {
    // OK
    public final ImmutableSet<String> names;
    
    // NG Objectクラスは「immutableClassCanonicalNames」に含まれていないのでNG
    public final ImmutableSet<Object> objects;
}

ignoreAnnotationCanonicalNames

メンバに付与していた場合にチェック対象外とするアノテーションの正規名(コンマ区切りで複数指定可能)

設定ファイル記述方法

<module name="Checker">
    <module name="TreeWalker">
        <module name="VisibilityModifier">
            <property name="ignoreAnnotationCanonicalNames" value="CustomAnnotation"/>
        </module>
    </module>
</module>

チェック実行例

class MyClass {
    // NG 「ignoreAnnotationCanonicalNames」に含まれるアノテーションではないのでpublicで宣言しない
    @org.junit.Rule
    public TemporaryFolder publicJUnitRule = new TemporaryFolder();
    
    // NG 「ignoreAnnotationCanonicalNames」に含まれるアノテーションではないのでpublicで宣言しない
    @org.junit.ClassRule
    public static TemporaryFolder publicJUnitClassRule = new TemporaryFolder();
    
    // NG publicでメンバを宣言しない
    public String testString = "";
    
    // OK
    private String str = "aaa";
}