検証環境
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"; }