Checkstyle / Module / ClassDesign



VisibilityModifier

親モジュールTreeWalker
実装クラスcom.puppycrawl.tools.checkstyle.checks.VisibilityModifierCheck(≦3.1)
com.puppycrawl.tools.checkstyle.checks.design.VisibilityModifierCheck(3.2)

フィールドに適切なアクセス制限がかかっているかをチェックします。

Rationale: カプセル化を強制させるため。

プロパティ名デフォルト概要
packageAllowedBooleanfalsepackage(デフォルト)修飾子を認めるかどうか?
protectedAllowedBooleanfalseprotected 修飾子を認めるかどうか?
publicMemberPatternRegular Expression^serialVersionUID$public修飾子を認めるメンバを表す正規表現

記述サンプル

  • Standard Checkstyle
    <module name = "Visibility Modifier">
        <property name = "packageAllowed" value = "false" />
        <property name = "protectedAllowed" value = "false" />
        <property name = "publicMemberPattern" value = "^$" />
    </module>
  • Plug-in Checkstyle
    <rule-configuration 
        classname = "com.puppycrawl.tools.checkstyle.checks.VisibilityModifierCheck"
        severity = "warning">
        <config-properties>
            <config-property name = "packageAllowed" value = "false" />
            <config-property name = "protectedAllowed" value = "false" />
            <config-property name = "publicMemberPattern" value = "^$" />
        </config-properties>
    </rule-configuration>

チェックサンプル

<module name = "Visibility Modifier">
    <property name = "packageAllowed" value = "false" />
    <property name = "protectedAllowed" value = "false" />
</module>

としたとき、以下のようになる。以下の例は、インスタンスフィールドの宣言とする。

OK!  private String name;
Boo! protected String name;
Boo! String name;
Boo! public String name; 

FinalClass

親モジュールTreeWalker
実装クラスcom.puppycrawl.tools.checkstyle.checks.FinalClassCheck(3.1)
com.puppycrawl.tools.checkstyle.checks.design.FinalClassCheck(3.2)
Since3.1

private なコンストラクタしかないクラスがfinal宣言されているかをチェックします。

これは、private なコンストラクタしかないクラスを継承したサブクラスがインスタンス化できないからです。そのため、final宣言することによって、継承できないことを明示します。

記述サンプル

  • Standard Checkstyle
    <module name = "FinalClass" />
  • Plug-in Checkstyle
    <rule-configuration
        classname = "com.puppycrawl.tools.checkstyle.checks.FinalClassCheck"
        severity = "warning">
        <config-properties />
    </rule-configuration>

InterfaceIsType

親モジュールTreeWalker
実装クラスcom.puppycrawl.tools.checkstyle.checks.InterfaceIsTypeCheck(3.1)
com.puppycrawl.tools.checkstyle.checks.design.InterfaceIsTypeCheck(3.2)
Since3.1

定数インターフェイスをチェックします。

参照: Effective Java 第4章 項目17 型を定義するためだけにインタフェースを使用する

プロパティ名デフォルト概要
allowMarkerInterfaceBooleantrueマーカインターフェイスを許可するかどうか?

記述サンプル

  • Standard Checkstyle
    <module name = "InterfaceIstype">
        <property name = "allowMarkerInterface" value = "true" />
    </module>
  • Plug-in Checkstyle
    <rule-configuration
        classname = "com.puppycrawl.tools.checkstyle.checks.InterfaceIsTypeCheck"
        severity = "warning">
        <config-properties>
            <config-property name = "allowMarkerInterface" value = "true" />
        </config-properties>
    </rule-configuration>

HideUtilityClassConstructor

親モジュールTreeWalker
実装クラスcom.puppycrawl.tools.checkstyle.checks.HideUtilityClassConstructorCheck(3.1)
com.puppycrawl.tools.checkstyle.checks.design.HideUtilityClassConstructorCheck(3.2)
Since3.1

ユーティリティクラス(スタティックメソッドしか持たないクラス)が、パブリックなコンストラクタを持っているかどうかチェックします。

Rationale: ユーティリティクラスをインスタンス化することに意味はない。そのため、コンストラクタは、private か(サブクラス化を考慮して)protected にすべきである。よくあるミスは、デフォルトコンストラクタを隠し忘れること。

記述サンプル

  • Standard Checkstyle
    <module name = "HideUtilityClassConstructor" />
  • Plug-in Checkstyle
    <rule-configuration 
        classname = "com.puppycrawl.tools.checkstyle.checks.HideUtilityClassConstructorCheck"
        severity = "warning">
        <config-properties />
    </rule-configuration>

DesignForExtension

親モジュールTreeWalker
実装クラスcom.puppycrawl.tools.checkstyle.checks.DesignForExtensionCheck(3.1)
com.puppycrawl.tools.checkstyle.checks.design.DesignForExtensionCheck(3.2)
Since3.1

継承できるクラスであればそれを明示するように、継承して欲しくないクラスであればそれを明示するようにするためのチェックをします。

具体的には、以下のようなことを行います。サブクラス化できるクラスの private でもなく static でもないメソッドが以下の条件のどれかを満たしているかをチェックします。

  • abstract である。
  • final である。
  • 実装が空である。

Rationale: この API デザインスタイルは、サブクラスによってスーパークラスが壊されるのを防ぎます。半面、サブクラスは自由度が制限されてしまいます。特に、スーパークラスの実行されるコードを防ぐことができません。しかしこれは、サブクラスがスーパーメソッドを呼ぶのを忘れることによって、スーパークラスの状態を壊すことができないことを意味します。


記述サンプル

  • Standard Checkstyle
    <module name = "DesignForExtension" />
  • Plug-in Checkstyle
    <rule-configuration
        classname = "com.puppycrawl.tools.checkstyle.checks.DesignForExtensionCheck"
        severity = "warning">
        <config-properties />
    </rule-configuration>

ThrowsCount

親モジュールTreeWalker
実装クラスcom.puppycrawl.tools.checkstyle.checks.design.ThrowsCountCheck
Since3.2

メソッドからスローされる例外の数をチェックします。

Rationale: 例外はメソッドインターフェイスの一部です。あまりに多くの異なるルートをもった例外をスローするように宣言されたメソッドは、例外捕捉処理が面倒で、catch (Exception) のように悪いプログラミング習慣をもたらします。このチェックは、例外の改装内の最もシンプルなものを宣言することを開発者に強制します。これにより、メソッドの呼び出し側は、ただ1つだけ例外をチェックすればよくなるが、必要ならば特定の(宣言された例外の)サブクラスをキャッチすることもできます。

プロパティ名デフォルト概要
maxIntegertrueマーカインターフェイスを許可するかどうか?