Checkstyle / Module / CodingProbrems



ArrayTrailingComma

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

配列を初期化するときに、各配列要素の後ろにカンマを付けているかをチェックします。例外として、配列要素が同一行で中括弧で囲われている場合は除きます。

Rationale: カンマを付けることによって、配列要素の順番を変えたり追加したりするのが簡単になります。

記述サンプル

  • Standard Checkstyle
    <module name = "ArrayTrailingComma" />

チェックサンプル

<module name = "ArrayTrailingComma" />

としたとき、以下のようになります。

OK!  int[] numbers = new int[] {
                         1,
                         2,
                         3,
                     };
Boo! int[] numbers = new int[] {
                         1,
                         2
                     };
OK!  int[] numbers = new int[] { 0, 1 };

AvoidInlineConditionals

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

条件演算子(?:)があるかをチェックします。

Rationale: 開発者の中には、条件演算子は読みにくい人もいる。そのため、会社のコーディング規約で禁止されることもある。

記述サンプル

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

CovariantEquals

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

DoubleCheckedLocking

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

Double-checked Locking Idiom を使っていないかをチェックします。 これに関する詳細は、http://www-6.ibm.com/jp/developerworks/java/020726/j_j-dcl.html を。

記述サンプル

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

EmptyStatement

親モジュールTreeWalker
実装クラスcom.puppycrawl.tools.checkstyle.checks.EmptyStatementCheck(3.1)
com.puppycrawl.tools.checkstyle.checks.coding.EmptyStatementCheck(3.2)
Since3.2

空文(; のみの文)をチェックします。

記述サンプル

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

EqualHashCode

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

equals(), hashCode() メソッドをきちんとオーバーライドしているかをチェックします。

Rationale: equals() と hashCode() を実装することは、等価なオブジェクトは同じハッシュコードを持つために必要です。それゆえ、equals()をオーバーライドするときはいつでも、hashCode() をオーバーライドすることによって、ハッシュを基としたコレクションでの動作を確実なものにすることができます。

記述サンプル

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

HiddenField

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

ローカル変数やメソッドの引数が、フィールドと同じ名前をつけているかをチェックします。

プロパティ名デフォルト概要
tokensPARAMETER_DEF, VARIABLE_DEFすべてチェック対象を選択

記述サンプル

  • Standard Checkstyle
    <module name = "HiddenFieldCheck">
        <property name = "tokens" value = "PARAMETER_DEF" />
    </module>
  • Plug-in Checkstyle
    <rule-configuration
        classname = "com.puppycrawl.tools.checkstyle.checks.HiddenFieldCheck"
        severity = "warning">
        <config-properties>
            <config-property name = "option" value = "PARAMETER_DEF" />
        </config-properties>
    </rule-configuration>

IllegalInstantiation

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

ファクトリを使ってインスタンスを生成すべきところで、コンストラクタを使っている部分をチェックします。

Rationale: 幾つかのクラスでは、コンストラクタではなくファクトリメソッドを使ってインスタンスを生成するほうが良い場合がある。簡単な例に、java.lang.Boolean がある。このクラスでは、メモリや CPU をけちるために既に定義済みの定数 TRUE 及び FALSE の利用が好まれる。コンストラクタ呼び出しは、Boolean.valueOf() に置き換えることができる。

パフォーマンスを要求されるプロジェクトでは、他のクラスでもファクトリメソッドを使う必要がある。これによって、オブジェクトプールやキャッシュの仕組みを使った制御が可能になる。


記述サンプル

  • Standard Checkstyle
    <module name = "IllegalInstantiation">
        <property name = "classes" value = "java.lang.Boolean" />
    </module>
  • Plug-in Checkstyle
    <rule-configuration
        classname = "com.puppycrawl.tools.checkstyle.checks.IllegalInstantiationCheck"
        severity = "warning">
        <config-properties>
            <config-property name = "classes" value = "java.lang.Boolean" />
        </config-properties>
    </rule-configuration>

InnerAssignment

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

式の内側での代入文があるかをチェックします。具体的には、

String s = Integer.toString(i = 2);

のようなもの("i = 2" の部分)をチェックします。

Rationale: for 文は例外として、すべての代入は式のトップレベルで行い読みやすくするべきである。上記の例のように式の内側で代入をしていると、値を設定している部分を見ることが難しくなる。

プロパティ名デフォルト概要
tokensASSIGN, BAND_ASSIGN, BOR_ASSIGN, BSR_ASSIGN, BXORASSIGN, DIV_ASSIGN, MINUS_ASSIGN, MOD_ASSIGN, PLUS_ASSIGN, SL_ASSIGN, SR_ASSIGN, STAR_ASSIGNすべてチェック対象を選択

記述サンプル

  • Standard Checkstyle
    <module name = "IllegalAssignment">
        <property name = "tokens" value = "ASSIGN" />
    </module>
  • Plug-in Checkstyle
    <rule-configuration
        classname = "com.puppycrawl.tools.checkstyle.checks.IllegalAssignmentCheck"
        severity = "warning">
        <config-properties>
            <config-property name = "tokens" value = "ASSIGN" />
        </config-properties>
    </rule-configuration>

MagicNumber

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

マジックナンバーがないことをチェックします。マジックナンバーとは、ソースにべた書きされた数値のことです。ぱっと見はただの数値だが、なんかしらの意味を与えられているものを指します。

ここでは、定数定義以外で使われている数値に関してチェックされます。

プロパティ名デフォルト概要
tokensNUM_DOUBLE, NUM_FLOAT, NUM_INT, NUM_LONGすべてチェック対象を選択
ignoreNumbersInteger Set-1, 0, 1, 2マジックナンバーとしてみなさない数字

記述サンプル

  • Standard Checkstyle
    <module name = "MagicNumber">
        <property name = "tokens" value = "NUM_INT" />
        <property name = "ignoreNumbers" value = "-1, 0, 1" />
    </module>
  • Plug-in Checkstyle
    <rule-configuration
        classname = "com.puppycrawl.tools.checkstyle.checks.MagicNumberCheck"
        severity = "warning">
        <config-properties>
            <config-property name = "tokens" value = "NUM_INT" />
            <config-property name = "ignoreNumbers" value = "-1, 0, 1" />
        </config-properties>
    </rule-configuration>

チェックサンプル

<module name = "MagicNumber">
    <property name = "tokens" value = "NUM_INT" />
    <property name = "ignoreNumbers" value = "-1, 0, 1" />
</module>

としたとき、次のようになります。

OK!  private static final int MAX = 1000;
Boo! private int MAX = 1000;
Boo! private static final int MAX = 100 * 10;

MissingSwitchDefault

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

switch 文に default ラベルがあるかをチェックします。

Rationale: すべての switch 文に default: を用意するのはよいアイデアです。開発者が、現状のすべての可能性のあるケースに対応できると確信していたとしても、default: を用意するべきである(例えば、アサーションとして利用する)。この方法は、コードの将来的な変更に対する備えとなる(例えば、Enum に新しいタイプを導入するとき)。

記述サンプル

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

RedundantThrows

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

throws 句の冗長な例外の宣言をチェックします。例えば、重複していたり、未チェック例外が入っていたり、既に宣言した例外のサブクラスなどです。

プロパティ名デフォルト概要
allowUncheckedBooleanfalse未チェック例外を認めるか?
allowSubclassesBooleanfalseサブクラスの宣言を認めるか?

記述サンプル

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

SimplifyBooleanExpression

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

過度に複雑な論理演算式をチェックします。現在は、if (b == true) とか、b || true, !false などをチェックします。

Rationale: 複雑な論理演算は、コードの理解を難しくし維持するのが困難になります。

記述サンプル

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

SimplifyBooleanReturn

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

boolean 型を返す return 文が過度に複雑であるかをチェックします。例えば、

if (valid())
    return false;
else
    return true;

は、

return !valid();

としなさいよというチェックです。このルールは、PMD の真似らしいです。

記述サンプル

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