Checkstyle チェック項目ーCoding

Checkstyleチェック項目:Coding

CheckStyle公式ドキュメント

ver 10.3.1

ArrayTrailingComma

配列の初期化時に、末尾にコンマが含まれているかどうかをチェックする。
デフォルトでは、配列の最後の要素と同じ行に左中括弧も右中括弧もない場合、最後にコンマが必要となる。

プロパティ

プロパティ デフォルト値 説明
alwaysDemandTrailingComma boolean false 常に末尾のコンマをチェックするかどうか

チェック設定例

プロパティ設定なし

<module name="ArrayTrailingComma"/>

プロパティ設定あり

<module name="ArrayTrailingComma">
    <property name="alwaysDemandTrailingComma" value="true"/>
</module>

チェック実行例

プロパティ設定なし

// OK
int[] numbers = { 1, 2, 3 };

// NG 末尾にコンマが必要
boolean[] bools = {
    true,
    true,
    false
};

プロパティ設定あり

// NG 「alwaysDemandTrailingComma=true」なので末尾にコンマが必要
int[] numbers = { 1, 2, 3 };

// NG 末尾にコンマが必要
boolean[] bools = {
    true,
    true,
    false
};

AvoidDoubleBraceInitialization

二重括弧初期化(DBI)を検出する。
DBI:最初の括弧で匿名クラスを生成し、次の括弧が初期化ブロックでオブジェクトを初期化する記述方法のこと。参考

プロパティ

なし

チェック設定例

<module name="AvoidDoubleBraceInitialization"/>

チェック実行例

class MyClass {
    // OK
    List<Integer> list1 = new ArrayList<>();
    list1.add(1);
    
    // NG DBIは使用しない
    List<String> list2 = new ArrayList<>() {
        {
            add("aaa");
        }
    };
}

AvoidInlineConditionals

インライン条件文を検出する。
〇 インライン条件文のサンプル

String a = getParameter("a");  
String b = (a == null || a.length() < 1) ? null : a.substring(1);

プロパティ

なし

チェック設定例

<module name="AvoidInlineConditionals"/>

チェック実行例

// OK
int x = 5;
boolean foobar = (x == 5);

// NG インライン条件文は使用しない
String text;
text = (text == null) ? "" : text;

AvoidNoArgumentSuperConstructorCall

引数なしのスーパークラスのコンストラクタ呼出しがあるかどうかをチェックする。
コンストラクタ本体は暗黙のうちにスーパークラスのコンストラクタを呼出しているため、 super() の明示的な呼出しは不要。

プロパティ

なし

チェック設定例

<module name="AvoidNoArgumentSuperConstructorCall"/>

チェック実行例

class MyClass extends ParentClass {
    // NG 明示的にsuper();を呼び出さない
    MyClass() {
        super();
    }

    // OK
    MyClass(int arg) {
        super(arg);
    }

    // OK
    MyClass(long arg) {
    }
}

CovariantEquals

共変なequals()メソッドを定義しているクラスやレコードが、equals(Object)メソッドもオーバーライドしているかどうかをチェックする。
共変なequals()メソッド:equals(Object) と同様のメソッドであるが、引数の型が共変(Objectの任意のサブクラス)なメソッドのこと。

プロパティ

なし

チェック設定例

<module name="CovariantEquals"/>

チェック実行例

// NG equals(Object)がオーバーライドされていない
class MyClass {
    public boolean equals(Test i) {
        return false;
    }
}

// OK
class MyClass {
    public boolean equals(Test i) {
        return false;
    }

    public boolean equals(Object i) {
        return false;
    }
}

DeclarationOrder

クラス、レコード、インタフェース宣言の各部分が、Javaプログラミング言語のコード規約で推奨される順序で表示されているかどうかをチェックする。

Javaプログラミング言語のコード規約によると、クラスやインターフェースの宣言は、次のような順序で記述することになっている。

  1. クラス(static)変数
    public, protected, パッケージプライベート, privateの順に記述
  2. インスタンス変数
    public, protected, パッケージプライベート, privateの順に記述
  3. コンストラク
  4. メソッド

プロパティ

プロパティ デフォルト値 説明
ignoreConstructors boolean false コンストラクタを無視するかどうか
ignoreModifiers boolean false 修飾子を無視するかどうか

チェック設定例

プロパティ設定なし

<module name="ArrayTrailingComma"/>

プロパティ設定あり

<module name="DeclarationOrder">
    <property name="ignoreConstructors" value="true"/>
    <property name="ignoreModifiers" value="true"/>
</module>

チェック実行例

プロパティ設定なし

public class MyClass {

    public int a;
    
    protected int b;
    
    // NG protectedなメンバ変数より上に記述するべき
    public int c;

    MyClass() {
        this.a = 0;
    }

    public void foo() {
    }

    // NG メソッドより上に記述するべき
    MyClass(int a) {
        this.a = a;
    }

    // NG メンバ変数はメソッド・コンストラクタより上に記述するべき
    private String name;
}

プロパティ設定あり

public class MyClass {

    public int a;
    
    protected int b;
    
    // OK 「ignoreModifiers=true」なので修飾子の順番はチェックされない
    public int c;

    MyClass() {
        this.a = 0;
    }

    public void foo() {
    }

    // OK 「ignoreConstructors=true」なのでコンストラクタはチェックされない
    MyClass(int a) {
        this.a = a;
    }

    // NG メンバ変数はメソッド・コンストラクタより上に記述するべき
    private String name;
}

DefaultComesLast

switch文の中で default がすべてのcaseの後にあることをチェックする。

プロパティ

プロパティ デフォルト値 説明
skipIfLastAndSharedWithCase boolean false defaultが最後でない場合に、caseと一緒にいるdefaultを許可するかどうか

チェック設定例

プロパティ設定なし

<module name="DefaultComesLast"/>

プロパティ設定あり

<module name="DefaultComesLast">
    <property name="skipIfLastAndSharedWithCase" value="true"/>
</module>

チェック実行例

プロパティ設定なし

// OK
switch (i) {
    case 1:
        break;
    case 2:
        break;
    default:
        break;
}

// NG default の後ろにも case が存在している
switch (i) {
    case 1:
        break;
    default:
        break;
    case 2:
        break;
}

// NG default の後ろにも case が存在している
switch (i) {
    case 1:
        break;
    case 2:
    default:
        break;
    case 3:
        break;
}

プロパティ設定あり

// OK
switch (i) {
    case 1:
        break;
    case 2:
        break;
    default:
        break;
}

// NG default の後ろにも case が存在している
switch (i) {
    case 1:
        break;
    default:
        break;
    case 2:
        break;
}

// OK 「skipIfLastAndSharedWithCase=true」のため、caseと一緒にいる場合はOK
switch (i) {
    case 1:
        break;
    case 2:
    default:
        break;
    case 3:
        break;
}

EmptyStatement

空のステートメント(単体のセミコロン「;」)を検出する。

プロパティ

なし

チェック設定例

<module name="EmptyStatement"/>

チェック実行例

public void foo() {
    int i = 5;
    
    // NG (i > 3)の後ろのセミコロンは不要
    if (i > 3);
        i++;
    // NG (i = 0; i < 5; i++)の後ろのセミコロンは不要
    for (i = 0; i < 5; i++);
        i++;
    // OK
    while (i > 10)
        i++;
}

EqualsAvoidNull

Stringのequals()メソッド呼び出し時にnullでない値が呼び元となっていることをチェックする。

プロパティ

プロパティ デフォルト値 説明
ignoreEqualsIgnoreCase boolean false String.equalsIgnoreCase(String)呼び出しの場合を無視するかどうか

チェック設定例

プロパティ設定なし

<module name="EqualsAvoidNull"/>

プロパティ設定あり

<module name="EqualsAvoidNull">
    <property name="ignoreEqualsIgnoreCase" value="true"/>
</module>

チェック実行例

プロパティ設定なし

String nullString = null;

// NG nullかもしれない値が呼び元になっている
nullString.equals("String");
// OK
"String".equals(nullString);

// NG nullかもしれない値が呼び元になっている
nullString.equalsIgnoreCase("String");
// OK
"String".equalsIgnoreCase(nullString);

プロパティ設定あり

String nullString = null;

// NG nullかもしれない値が呼び元になっている
nullString.equals("String");
// OK
"String".equals(nullString);

// OK 「ignoreEqualsIgnoreCase=true」なのでequalsIgnoreCase(String)の呼び出しはチェックされない
nullString.equalsIgnoreCase("String");
// OK
"String".equalsIgnoreCase(nullString);

EqualsHashCode

equals() と hashCode() のどちらかをオーバーライドしているクラスが、もう一方もオーバーライドしているかどうかをチェックする。

プロパティ

なし

チェック設定例

<module name="EqualsHashCode"/>

チェック実行例

// NG equals(Object)のオーバーライドがない
public static class Example1 {
    public int hashCode() {
    }
    
    public boolean equals(String o) {
    }
}

// NG hashCode()のオーバーライドがない
public static class Example2 {
    public boolean equals(Object o) {
    }
    
    public boolean equals(String o) {
    }
}

// OK
public static class Example3 {
    public int hashCode() {
    }
    
    public boolean equals(Object o) { 
    }
    
    public boolean equals(String o) {
    }
}

ExplicitInitialization

クラスまたはオブジェクトのメンバが明示的にその型のデフォルト値に初期化されているかどうかをチェックする。
オブジェクトの場合はnull、数値型およびcharの場合は0、booleanの場合はfalse。
インスタンス変数は、同じ値で2回初期化されることになるので非効率。

プロパティ

プロパティ デフォルト値 説明
onlyObjectReferences boolean false オブジェクトのNULLへの明示的な初期化のみをチェックするかどうか

チェック設定例

プロパティ設定なし

<module name="ExplicitInitialization"/>

プロパティ設定あり

<module name="ExplicitInitialization">
    <property name="onlyObjectReferences" value="true"/>
</module>

チェック実行例

プロパティ設定なし

public class MyClass {
    // NG intのデフォルト値で明示的に初期化しない
    private int intField1 = 0;
    // OK
    private int intField2 = 1;
    // OK
    private int intField3;
    
    // NG objectのデフォルト値で明示的に初期化しない
    private Obj objField1 = null;
    // OK
    private Obj objField2 = new Obj();
    // OK
    private Obj objField3;
}

プロパティ設定あり

public class MyClass {
    // OK 「onlyObjectReferences=true」なのでチェックされない
    private int intField1 = 0;
    // OK
    private int intField2 = 1;
    // OK
    private int intField3;
    
    // NG objectのデフォルト値で明示的に初期化しない
    private Obj objField1 = null;
    // OK
    private Obj objField2 = new Obj();
    // OK
    private Obj objField3;
}

FallThrough

switch の case にコードが含まれているが、break、return、throw、continue文がない箇所がないかどうかをチェックする。

プロパティ

プロパティ デフォルト値 説明
checkLastCaseGroup boolean false 最後のcaseをチェックするかどうか
reliefPattern Pattern `"falls?[ -]?thr(u ough)"`|警告を抑制するコメントの正規表現

チェック設定例

プロパティ設定なし

<module name="FallThrough"/>

プロパティ設定あり

<module name="FallThrough">
    <property name="checkLastCaseGroup" value="true"/>
    <property name="reliefPattern" value="FALL?[ -]?THROUGH"/>
</module>

チェック実行例

プロパティ設定なし

public void foo() throws Exception {
    int i = 0;
    while (i >= 0) {
        switch (i) {
            // NG caseにコードが含まれているのに
            // break, return, continueなどが記述されていない
            case 1:
                i++;
            case 2:
                i++;
                break;
            // チェック抑制のコメントがあるのでOK
            case 3:
                i++;
                // fall-through
            // 最後のケースはチェックされないためOK
            case 4:
                i++;
        }
    }
}

プロパティ設定あり

public void foo() throws Exception {
    int i = 0;
    while (i >= 0) {
        switch (i) {
            // NG caseにコードが含まれているのに
            // break, return, continueなどが記述されていない
            case 1:
                i++;
            case 2:
                i++;
                break;
            // NG チェック抑制のコメントが「reliefPattern」に設定した正規表現にマッチしないのでチェックされる
            case 3:
                i++;
                // fall-through
            // NG 「checkLastCaseGroup=true」なので最後のケースもチェックされる
            case 4:
                i++;
        }
    }
}

FinalLocalVariable

値が変更されることのないローカル変数が final で宣言されているかどうかをチェックする。
変更されないパラメータが final と宣言されているかどうかもチェックするように設定することができる。

プロパティ

プロパティ デフォルト値 説明
validateEnhancedForLoopVariable boolean false 拡張for文の変数をチェックするかどうか
tokens トークンのサブセット VARIABLE_DEF チェック対象のトーク

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

説明
PARAMETER_DEF パラメータ宣言
VARIABLE_DEF ローカル変数・フィールド宣言

チェック設定例

プロパティ設定なし

<module name="FinalLocalVariable"/>

プロパティ設定あり

<module name="FinalLocalVariable">
    <property name="tokens" value="VARIABLE_DEF,PARAMETER_DEF"/>
    <property name="validateEnhancedForLoopVariable" value="true"/>
</module>

チェック実行例

プロパティ設定なし

public class MyClass {
    // OK パラメータはチェック対象外
    static int foo(int x, int y) {
        return x + y;
    }
  
    public static void main (String []args) {
        // OK 拡張for文の変数はチェック対象外
        for (String i : args) {
            System.out.println(i);
        }
        // NG resultは値が変更されないのでfinalを付与する
        int result = foo(1, 2);
    }
}

プロパティ設定あり

public class MyClass {
    // NG パラメータもチェック対象なので、変更されない場合はfinalを付与する
    static int foo(int x, int y) {
        return x + y;
    }
  
    public static void main (String []args) {
        // NG 「validateEnhancedForLoopVariable=true」なので
        // finalがないとチェックNG
        for (String i : args) {
            System.out.println(i);
        }
        // NG resultは値が変更されないのでfinalを付与する
        int result=foo(1,2);
    }
}

HiddenField

ローカル変数やパラメータが同じクラスで定義されているフィールドを隠してしまっていないかをチェックする。
セッターを無視するようにチェックを設定することが出来る。

プロパティ

プロパティ デフォルト値 説明
ignoreFormat Pattern null 無視する変数名やパラメータ名の正規表現
ignoreConstructor Parameter boolean false コンストラクタのパラメータを無視するかどうか
ignoreSetter boolean false セッターのパラメータを無視するかどうか
setterCan ReturnItsClass boolean false セッターの定義を拡張して、クラスのインスタンスを返すメソッドを含めることができるようにするかどうか
ignoreAbstract Methods boolean false 抽象メソッドのパラメータを無視するかどうか
tokens トークンのサブセット VARIABLE_DEF, PARAMETER_DEF, PATTERN_VARIABLE_DEF, LAMBDA, RECORD_COMPONENT_DEF チェック対象のトーク

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

説明
LAMBDA ラムダ式->
PARAMETER_DEF パラメータ宣言
PATTERN_VARIABLE_DEF パターン変数宣言
RECORD_COMPONENT_DEF レコードコンポーネント宣言
VARIABLE_DEF 変数宣言

チェック設定例

プロパティ設定なし

<module name="HiddenField"/>

プロパティ設定あり

<module name="HiddenField">
    <property name="ignoreFormat" value="^testField"/>
    <property name="ignoreConstructorParameter" value="true"/>
    <property name="ignoreSetter" value="true"/>
    <property name="setterCanReturnItsClass" value="true"/>
    <property name="ignoreAbstractMethods" value="true"/>
</module>

チェック実行例

プロパティ設定なし

public abstract class SomeClass {

    private String field;
    private String testField;

    // NG フィールド名と同じパラメータ名
    abstract void foo(String field);
    
    // NG フィールド名と同じパラメータ名
    public SomeClass(String testField) {
    }

    // NG フィールド名と同じパラメータ名
    public void method(String testField) {
    }
    
    // OK
    public void method(String param) {
        String field = param;
    }

    // NG フィールド名と同じパラメータ名
    public void setField(String field) {
        this.field = field;
    }

    // NG フィールド名と同じパラメータ名
    public SomeClass setField(String testField) {
        this.field = field;
    }
}

プロパティ設定あり

public abstract class SomeClass {

    private String field;
    private String testField;

    // OK 「ignoreAbstractMethods=true」なのでチェックされない
    abstract void foo(String field);
    
    // OK 「ignoreConstructorParameter=true」なのでチェックされない
    public SomeClass(String testField) {
    }
    
    // OK 「ignoreFormat」に設定の値と合致する変数名なのでチェックされない
    public void method(String testField) {
    }
    
    // OK
    public void method(String param) {
        String field = param;
    }

    // OK 「ignoreSetter=true」なのでチェックされない
    public void setField(String field) {
        this.field = field;
    }

    // 「setterCanReturnItsClass=true」なのでセッター扱いされる
    // OK 「ignoreSetter=true」なのでチェックされない
    public SomeClass setField(String testField) {
        this.field = field;
    }
}

IllegalCatch

特定の例外クラスがcatch文に現れないことをチェックする。 デフォルトでは、Error, Exception, RuntimeException, Throwableがcatchに記述されている場合に検出される。

プロパティ

プロパティ デフォルト値 説明
illegalClassNames String[] Error, Exception, RuntimeException, Throwable, java.lang.Error, java.lang.Exception, java.lang.RuntimeException, java.lang.Throwable 拒否する例外クラス名

チェック設定例

プロパティ設定なし

<module name="IllegalCatch"/>

プロパティ設定あり

<module name="IllegalCatch">
    <property name="illegalClassNames" value="IllegalArgumentException, OutOfMemoryError"/>
</module>

チェック実行例

プロパティ設定なし

// NG catchにExceptionクラスを書かない
try {
} catch (Exception e) {
}

try {
// OK
} catch (IllegalArgumentException e) {
// NG catchにRuntimeExceptionクラスを書かない
} catch (RuntimeException e) {
}

プロパティ設定あり

// OK
try {
} catch (Exception e) {
}

try {
// NG catchにIllegalArgumentExceptionクラスを書かない
} catch (IllegalArgumentException e) {
// OK
} catch (RuntimeException e) {
}

IllegalInstantiation

ファクトリーメソッドを使用してインスタンスを作成することが望ましいものが、コンストラクタでインスタンスを作成していないかどうかをチェックする。

プロパティ

プロパティ デフォルト値 説明
classes String[] {} インスタンス化しない完全修飾クラス名
tokens トークンの サブセット(CLASS_DEFのみ) CLASS_DEF チェック対象のトーク

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

説明
CLASS_DEF クラス宣言

チェック設定例

プロパティ設定なし

<module name="IllegalInstantiation"/>

プロパティ設定あり

<module name="IllegalInstantiation">
    <property name="classes" value="java.lang.Boolean, java.lang.Integer"/>
    <property name="tokens" value="CLASS_DEF, LITERAL_NEW, PACKAGE_DEF, IMPORT"/>
</module>

チェック実行例

プロパティ設定なし

プロパティの設定がない場合はチェックは実行されない。

プロパティ設定あり

// OK
public class MyClass {
    // 独自定義したBooleanクラス
    public class Boolean {
        boolean a;

        public Boolean (boolean a) { this.a = a; }
    }

    public void foo(boolean a, int b) {
        // OK
        Boolean c = new Boolean(a);
        // NG ファクトリーメソッドを使用してインスタンスを作成するべき
        java.lang.Boolean d = new java.lang.Boolean(a);
        // NG ファクトリーメソッドを使用してインスタンスを作成するべき
        Integer e = new Integer(b);
        // OK
        Integer f = Integer.valueOf(b);
    }
}

IllegalThrows

指定された例外クラスがスロー宣言されていないことをチェックする。 デフォルトではError, RuntimeException, Throwableをスロー宣言で記述すると検出される。

プロパティ

プロパティ デフォルト値 説明
illegalClassNames String[] Error, RuntimeException, Throwable, java.lang.Error, java.lang.RuntimeException, java.lang.Throwable 拒否する例外クラス名
ignoredMethodNames String[] finalize チェック対象外とするメソッド名
ignoreOverridden Methods boolean true Override または java.lang.Override アノテーションでマークされたオーバーライドされたメソッドをチェック対象外とするかどうか

チェック設定例

プロパティ設定なし

<module name="IllegalThrows"/>

プロパティ設定あり

<module name="IllegalThrows">
    <property name="illegalClassNames" value="RuntimeException, Error"/>
    <property name="ignoredMethodNames" value="func1"/>
    <property name="ignoreOverriddenMethods" value="false"/>
</module>

チェック実行例

プロパティ設定なし

public class MyClass {
    // NG RuntimeExceptionをスロー宣言で記述しない
    public void func1() throws RuntimeException {}
    
    // OK
    public void func2() throws Exception {}
    
    // NG Errorをスロー宣言で記述しない
    public void func3() throws Error {}
    
    // NG Throwableをスロー宣言で記述しない
    public void func4() throws Throwable {}
    
    // OK
    public void func5() throws NullPointerException {}
    
    // OK 「ignoreOverriddenMethods=true」なのでチェック対象外
    @Override
    public void toString() throws Error {}
}

プロパティ設定あり

public class MyClass {
    // OK 「ignoredMethodNames」で指定されたメソッド名と合致するのでチェック対象外
    public void func1() throws RuntimeException {}
    
    // OK
    public void func2() throws Exception {}
    
    // NG Errorをスロー宣言で記述しない
    public void func3() throws Error {}
    
    // OK
    public void func4() throws Throwable {}
    
    // OK
    public void func5() throws NullPointerException {}
    
    // NG 「ignoreOverriddenMethods=false」なのでチェック対象
    @Override
    public void toString() throws Error {}
}

IllegalToken

不正なトークンが記述されていないかどうかをチェックする。 デフォルトでは、ラベルが禁止となっている。

プロパティ

プロパティ デフォルト値 説明
tokens トークンのサブセット LABELED_STAT 拒否するトーク

チェック設定例

プロパティ設定なし

<module name="IllegalToken"/>

プロパティ設定あり

<module name="IllegalToken">
    <property name="tokens" value="LITERAL_IF"/>
</module>

チェック実行例

プロパティ設定なし

public void foo() {
    // NG ラベルは使用しない
    outer:
    for (int i = 0; i < 5; i++) {
        if (i == 1) {
            break outer;
        }
    }
}

プロパティ設定あり

public void foo() {
    outer:
    for (int i = 0; i < 5; i++) {
        // NG ifは使用しない
        if (i == 1) {
            break outer;
        }
    }
}

IllegalTokenText

指定されたトークンのテキストが不正なパターンにマッチするかどうかをチェックする。
デフォルトではトークンは未指定なので、チェックは実行されない。

プロパティ

プロパティ デフォルト値 説明
format Pattern "^$" 不正なパターンとする正規表現
ignoreCase boolean false マッチング時に大文字小文字を無視するかどうか
message String "" 違反に関する通知に使用されるメッセージ
tokens トークンのサブセット empty チェック対象のトーク

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

説明
CHAR_LITERAL 文字
COMMENT_CONTENT 一行コメントまたはブロックコメントのテキスト
IDENT 識別子
NUM_DOUBLE 倍精度浮動小数点数
NUM_FLOAT 単精度浮動小数
NUM_INT 整数
NUM_LONG 長整数
STRING_LITERAL 文字列
TEXT_BLOCK_CONTENT テキストブロック

チェック設定例

プロパティ設定なし

<module name="IllegalTokenText"/>

プロパティ設定あり

<module name="IllegalTokenText">
    <property name="tokens" value="STRING_LITERAL"/>
    <property name="format" value="a href"/>
</module>

チェック実行例

プロパティ設定なし

プロパティに設定がない場合はチェックは実行されない。

プロパティ設定あり

public void foo() {
    // NG 「format」に合致する文字列は記述しない
    String test = "a href";
    // OK
    String test2 = "A href";
}

IllegalType

特定のクラスやインターフェースが使用されないことをチェックする。

プロパティ

プロパティ デフォルト値 説明
validateAbstract ClassNames boolean false 抽象クラス名の検証を行うかどうか
illegalClassNames String[] HashMap, HashSet, LinkedHashMap, LinkedHashSet, TreeMap, TreeSet, java.util.HashMap, java.util.HashSet, java.util.LinkedHashMap, java.util.LinkedHashSet, java.util.TreeMap, java.util.TreeSet 変数宣言、戻り値、パラメーターの型として使用しないクラス
legalAbstract ClassNames String[] {} 型として使用することができる抽象クラス
ignoredMethodNames String[] getEnvironment, getInitialContext チェック対象外とするメソッド名
illegalAbstract ClassNameFormat Pattern "^(.*[.])?Abstract.*$" 不正な抽象クラス名とする正規表現
memberModifiers トークンのサブセット {} 指定された修飾子のいずれかを持つメソッドとフィールドのみをチェックするようにする
tokens トークンのサブセット ANNOTATION_FIELD_DEF, CLASS_DEF, INTERFACE_DEF, METHOD_CALL, METHOD_DEF, METHOD_REF, PARAMETER_DEF, VARIABLE_DEF, PATTERN_VARIABLE_DEF, RECORD_DEF, RECORD_COMPONENT_DEF チェック対象のトーク

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

説明
ANNOTATION_FIELD_DEF アノテーションフィールド宣言
CLASS_DEF クラス宣言
INTERFACE_DEF インターフェース宣言
METHOD_CALL メソッド呼び出し
METHOD_DEF メソッド宣言
METHOD_REF メソッド参照
PARAMETER_DEF パラメータ宣言
PATTERN_VARIABLE_DEF パターン変数定義
RECORD_COMPONENT_DEF レコードコンポーネント
RECORD_DEF レコード宣言
VARIABLE_DEF 変数宣言

チェック設定例

プロパティ設定なし

<module name="IllegalType"/>

プロパティ設定あり

<module name="IllegalType">
    <property name="tokens" value="METHOD_DEF"/>
</module>

チェック実行例

プロパティ設定なし

// NG TreeSetをクラス宣言に使用しない
public class Test extends TreeSet {
    // NG HashSetをメソッド宣言に使用しない
    public <T extends java.util.HashSet> void method() { 
        // NG LinkedHashMapを変数宣言に使用しない
        LinkedHashMap<Integer, String> lhmap = new LinkedHashMap<Integer, String>();

        // OK
        Map<Integer, String> map = new LinkedHashMap<Integer, String>();
    }
}

プロパティ設定あり

// OK チェック対象がメソッド宣言のみなのでOK
public class Test extends TreeSet {
    // NG HashSetをメソッド宣言に使用しない
    public <T extends java.util.HashSet> void method() { 
        // OK チェック対象がメソッド宣言のみなのでOK
        LinkedHashMap<Integer, String> lhmap = new LinkedHashMap<Integer, String>();
    }
}

他のプロパティを設定した場合のサンプルは公式ドキュメントを参照


InnerAssignment

String s = Integer.toString(i = 2)のような部分式での代入をチェックする。

プロパティ

なし

チェック設定例

<module name="InnerAssignment"/>

チェック実行例

class MyClass {

    void foo() {
        int a, b;
        
        // NG
        a = b = 5;

        // OK
        a = 5; b = 5;

        boolean someVal;
        // NG if文の中で代入しない
        if (someVal = true) {
        }
    }
}

MagicNumber

マジックナンバーがないことをチェックする。 デフォルトでは、-1, 0, 1, 2 はマジックナンバーとはみなされない。
マジックナンバー:定数として定義されていない数値リテラルのこと。

プロパティ

プロパティ デフォルト値 説明
ignoreNumbers double[] -1, 0, 1, 2 マジックナンバーとみなさない数値
ignoreHash CodeMethod boolean false hashCode メソッドのマジックナンバーをチェック対象外とするかどうか
ignoreAnnotation boolean false アノテーション宣言のマジックナンバーをチェック対象外とするかどうか
ignoreField Declaration boolean false フィールド宣言のマジックナンバーをチェック対象外とするかどうか
ignoreAnnotation ElementDefaults boolean true アノテーション要素のデフォルトでマジックナンバーをチェック対象外とするかどうか
constantWaiver ParentToken トークンのサブセット ARRAY_INIT, ASSIGN, DIV, ELIST, EXPR, LITERAL_NEW, METHOD_CALL, MINUS, PLUS, STAR, TYPECAST, UNARY_MINUS, UNARY_PLUS マジックナンバーの使用を許可するトーク
tokens トークンのサブセット NUM_DOUBLE, NUM_FLOAT, NUM_INT, NUM_LONG チェック対象のトーク

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

説明
NUM_DOUBLE 倍精度浮動小数点数リテラル
NUM_FLOAT 単精度浮動小数点数リテラル
NUM_INT 整数リテラル
NUM_LONG 長整数リテラル

チェック設定例

プロパティ設定なし

<module name="MagicNumber"/>

プロパティ設定あり

<module name="MagicNumber">
    <property name="tokens" value="NUM_DOUBLE, NUM_FLOAT, NUM_INT"/>
    <property name="ignoreNumbers" value="0, 0.5, 1"/>
    <property name="ignoreFieldDeclaration" value="true"/>
    <property name="ignoreHashCodeMethod" value="true"/>
    <property name="ignoreAnnotation" value="true"/>
</module>

チェック実行例

プロパティ設定なし

// NG アノテーションでマジックナンバーを使用しない
@MyAnnotation(6)
class MyClass {
    // NG フィールドでマジックナンバーを使用しない
    private field = 7;

    void foo() {
        // OK 「1」はマジックナンバーとみなさない
        int i = i + 1;
        // NG マジックナンバーを使用しない
        int j = j + 8;
    }

    // NG マジックナンバーを使用しない
    public int hashCode() {
        return 10;
    }
}

プロパティ設定あり

// OK 「ignoreAnnotation=true」なのでチェック対象外
@MyAnnotation(6)
class MyClass {
    // OK 「ignoreFieldDeclaration=true」なのでチェック対象外
    private field = 7;

    void foo() {
        // OK 「1」はマジックナンバーとみなさない
        int i = i + 1;
        // NG マジックナンバーを使用しない
        int j = j + 8;
    }

    // OK 「ignoreHashCodeMethod=true」なのでチェック対象外
    public int hashCode() {
        return 10;
    }
}

MissingCtor

クラス (抽象クラスを除く) がコンストラクタを定義し、デフォルトのものに依存しないことをチェックする。

プロパティ

なし

チェック設定例

<module name="MissingCtor"/>

チェック実行例

// OK
class MyClass {
    private int a;
    
    MyClass(int a) {
        this.a = a;
    }
}

// NG コンストラクタを明示的に定義する
class InvalidExample {
    public void test() {}
}

// OK 抽象クラスのなのでチェック対象外
abstract class AbstractExample {
    public abstract void test() {}
}

MissingSwitchDefault

switch文にdefault句があるかどうかをチェックする。

プロパティ

なし

チェック設定例

<module name="MissingSwitchDefault"/>

チェック実行例

// NG defaultがない
switch (i) {
    case 1:
        break;
    case 2:
        break;
}

// OK
switch (i) {
    case 1:
        break;
    case 2:
        break;
    default:
        break;
}

ModifiedControlVariable

forループの制御変数がforブロックの内部で変更されないことをチェックする。

プロパティ

プロパティ デフォルト値 説明
skipEnhanced ForLoopVariable boolean false 拡張for文の変数のチェックをスキップするかどうか

チェック設定例

プロパティ設定なし

<module name="ModifiedControlVariable"/>

プロパティ設定あり

<module name="ModifiedControlVariable">
    <property name="skipEnhancedForLoopVariable" value="true"/>
</module>

チェック実行例

プロパティ設定なし

// NG ループの内部で値が変更されている
for(int i=0;i < 8;i++) {
    i++;
}

String args1[] = {"Coding", "block"};
// NG ループの内部で値が変更されている
for (String arg: args1) {
    arg = arg.trim();
}

プロパティ設定あり

// NG ループの内部で値が変更されている
for(int i=0;i < 8;i++) {
    i++;
}

String args1[] = {"Coding", "block"};
// OK 「skipEnhancedForLoopVariable=true」なのでチェック対象外
for (String arg: args1) {
    arg = arg.trim();
}

MultipleStringLiterals

1つのファイルに同じ文字列リテラルが複数回出現していないかどうかをチェックする。

プロパティ

プロパティ デフォルト値 説明
allowedDuplicates int 1 警告を発生させずに許容する最大発生回数
ignoreStringsRegexp Pattern "^""$" チェック対象外とする文字列(引用符付き)の正規表現
ignoreOccurrence Context トークンのサブセット ANNOTATION ignoredStringsRegexp にマッチしない場合でも、重複する文字列が無視されるトークン型名

チェック設定例

プロパティ設定なし

<module name="MultipleStringLiterals"/>

プロパティ設定あり

<module name="MultipleStringLiterals">
    <property name="allowedDuplicates" value="2"/>
</module>

チェック実行例

プロパティ設定なし

public class MyClass {
    String a = "StringContents";
    
    String a1 = "unchecked";
    
    // OK アノテーションは「ignoreOccurrenceContext」に指定されているためチェック対象外
    @SuppressWarnings("unchecked")
    public void myTest() {
        // NG 変数aと同じ文字列
        String a2 = "StringContents";
        // NG 同じ文字列を2回使用している
        String a3 = "DoubleString" + "DoubleString";
        // OK
        String a4 = "SingleString";
    }
}

プロパティ設定あり

public class MyClass {
    String a = "StringContents";
    
    String a1 = "unchecked";
    
    // OK アノテーションは「ignoreOccurrenceContext」に指定されているためチェック対象外
    @SuppressWarnings("unchecked")
    public void myTest() {
        // OK 「allowedDuplicates=2」なので同じ文字列は2回まで定義可能
        String a2 = "StringContents";
        // OK 「allowedDuplicates=2」なので同じ文字列は2回まで定義可能
        String a3 = "DoubleString" + "DoubleString";
        // OK
        String a4 = "SingleString";
    }
}

MultipleVariableDeclarations

各変数宣言が独自の文, 独自の行にあることをチェックする。

プロパティ

なし

チェック設定例

<module name="MultipleVariableDeclarations"/>

チェック実行例

public class Test {
    public void myTest() {
        // OK
        int mid;
        int high;

        // NG 変数宣言は1行に1つとする
        int lower, higher;

        // NG 変数宣言は1つずつ独立した文とする
        int value,
            index;

        // NG 変数宣言は1行に1つとする
        int place = mid, number = high;
    }
}

NestedForDepth

ネストされたfor文を指定された深さに制限する。

プロパティ

プロパティ デフォルト値 説明
max int 1 入れ子にするforの最大数

チェック設定例

プロパティ設定なし

<module name="NestedForDepth"/>

プロパティ設定あり

<module name="NestedForDepth">
    <property name="max" value="2"/>
</module>

チェック実行例

プロパティ設定なし

// NG 入れ子にするfor文は1つまで
for(int i = 0; i < 10; i++) {
    for(int j = 0; j < i; j++) {
        for(int k = 0; k < j; k++) { 
        }
    }
}

// OK
for(int i = 0; i < 10; i++) {
    for(int j = 0; j < i; j++) { 
    }
}

プロパティ設定あり

// NG 「max=2」なので入れ子にするfor文は2つまで
for(int i = 0; i < 10; i++) {
    for(int j = 0; j < i; j++) {
        for(int k = 0; k < j; k++) {
            for(int l = 0; l < k; l++) {
            }
        }
    }
}

// OK
for(int i = 0; i < 10; i++) {
    for(int j = 0; j < i; j++) {
        for(int k = 0; k < j; k++) {
        }
    }
}

NestedIfDepth

ネストされたif文を指定された深さに制限する。

プロパティ

プロパティ デフォルト値 説明
max int 1 入れ子にするifの最大数

チェック設定例

プロパティ設定なし

<module name="NestedIfDepth"/>

プロパティ設定あり

<module name="NestedIfDepth">
    <property name="max" value="3"/>
</module>

チェック実行例

プロパティ設定なし

// NG 入れ子にするif文は1つまで
if (true) {
    if (true) {
        if (true) {
        }
    }
}

// OK
if (true) {
    if (true) {}
}

プロパティ設定あり

// NG「max=3」なので入れ子にするif文は3つまで
if (true) {
   if (true) {
      if (true) {
         if (true) {
            if (true) { 
            }
         }
      }
   }
}

// OK
if (true) {
   if (true) {
      if (true) {
         if (true) {}
      }
   }
}

NestedTryDepth

ネストされたtry-catch-finallyブロックを指定された深さに制限する。

プロパティ

プロパティ デフォルト値 説明
max int 1 入れ子にするtry-catchの最大数

チェック設定例

プロパティ設定なし

<module name="NestedTryDepth"/>

プロパティ設定あり

<module name="NestedTryDepth">
    <property name="max" value="3"/>
</module>

チェック実行例

プロパティ設定なし

// NG 入れ子にするtry-catchは1つまで
try {
    try {
        try {
        } catch (Exception e) {
        }
    } catch (Exception e) {
    }
} catch (Exception e) {
}

// OK
try {
    try {
    } catch (Exception e) {
    }
} catch (Exception e) {
}

プロパティ設定あり

// NG「max=3」なので入れ子にするtry-catchは3つまで
try {
    try {
        try {
            try {
                try { 
                } catch (Exception e) {
                }
            } catch (Exception e) {
            }
        } catch (Exception e) {
        }
    } catch (Exception e) {
    }
} catch (Exception e) {
}

// OK
try {
    try {
        try {
            try {
            } catch (Exception e) {
            }
        } catch (Exception e) {
        }
    } catch (Exception e) {
    }
} catch (Exception e) {
}

NoArrayTrailingComma

配列の初期化に末尾のコンマが含まれていないことをチェックする。

プロパティ

なし

チェック設定例

<module name="NoArrayTrailingComma"/>

チェック実行例

// NG 末尾のコンマは不要
String[] foo1 = {
  "FOO", 
  "BAR",
};

// NG 末尾のコンマは不要
String[] foo2 = { "FOO", "BAR", };

// OK
String[] foo3 = {
  "FOO",
  "BAR"
};
// OK
String[] foo4 = { "FOO", "BAR" };

NoClone

clone メソッドが Object クラスからオーバーライドされていないことを確認する。

プロパティ

なし

チェック設定例

<module name="NoClone"/>

チェック実行例

public class MyClass {
    // NG Object.cloneメソッドをオーバーライドしない
    public Object clone() {return null;}

    // NG Object.cloneメソッドをオーバーライドしない
    public Foo clone() {return null;}

    // OK
    public static Object clone(Object o) {return null;}

    // OK
    public static Foo clone(Foo o) {return null;}
}

NoEnumTrailingComma

enumの定義に末尾のカンマが含まれていないことをチェックする。

プロパティ

なし

チェック設定例

<module name="NoEnumTrailingComma"/>

チェック実行例

// OK
enum Foo1 {
    FOO,
    BAR;
}

// OK
enum Foo2 {
  FOO,
  BAR
}

// NG 末尾のコンマは不要
enum Foo3 {
  FOO,
  BAR,
}

// NG 末尾のコンマは不要
enum Foo4 {
  FOO,
  BAR,
  ;
}

NoFinalizer

パラメータのないメソッドfinalizerが存在しないことをチェックする。

プロパティ

なし

チェック設定例

<module name="NoFinalizer"/>

チェック実行例

public class MyClass {

    // NG パラメータなしfinalizer()メソッド
    protected void finalize() throws Throwable {
        try {
            System.out.println("overriding finalize()");
        } catch (Throwable t) {
            throw t;
        } finally {
            super.finalize();
        }
    }
}

OneStatementPerLine

1行に1つの文しかないことをチェックする。

プロパティ

プロパティ デフォルト値 説明
treatTryResources AsStatement boolean false try文の中のリソースを文として扱い、独立した行で要求するかどうか

チェック設定例

プロパティ設定なし

<module name="OneStatementPerLine"/>

プロパティ設定あり

<module name="OneStatementPerLine">
    <property name="treatTryResourcesAsStatement" value="true"/>
</module>

チェック実行例

プロパティ設定なし

// NG
int var1; int var2;

プロパティ設定あり

OutputStream s1 = new PipedOutputStream();
OutputStream s2 = new PipedOutputStream();
// OK
try (s1; s2; OutputStream s3 = new PipedOutputStream();){}

// NG tryの中でリソース宣言が複数ある場合はそれぞれ改行する
try (Reader r = new PipedReader(); s2; Reader s3 = new PipedReader()) {}

// OK
try (Reader r = new PipedReader(); s2; 
     Reader s3 = new PipedReader()) {}

OverloadMethodsDeclarationOrder

オーバーロードされたメソッドがグループ化されているかどうかをチェックする。

プロパティ

なし

チェック設定例

<module name="OverloadMethodsDeclarationOrder"/>

チェック実行例

// OK
public class MyClass {
    public void foo(int i) {}
    public void foo(String s) {}
    public void foo(String s, int i) {}
    public void foo(int i, String s) {}
    public void notFoo() {}
}

// NG notFooメソッドが間に割り込んでしまっている
public class MyClass {
    public void foo(int i) {}
    public void foo(String s) {} 
    public void notFoo() {} 
    public void foo(int i, String s) {}
    public void foo(String s, int i) {}
}

PackageDeclaration

クラスがパッケージ宣言を持つかどうかをチェックする。
プロパティを設定することでパッケージ名がソースファイルのディレクトリ名と一致するかどうか制御することができる。

プロパティ

プロパティ デフォルト値 説明
matchDirectory Structure boolean true ディレクトリとパッケージ名の一致をチェックするかどうか

チェック設定例

プロパティ設定なし

<module name="PackageDeclaration"/>

プロパティ設定あり

<module name="PackageDeclaration">
    <property name="matchDirectoryStructure" value="false"/>
</module>

チェック実行例

プロパティ設定なし

/com/puppycrawl/tools/checkstyle/checks/annotations/MyClass

// NG パッケージ名とディレクトリが合っていない
package com.puppycrawl.tools.checkstyle.checks;

public class MyClass extends AbstractCheck {
}

プロパティ設定あり

/com/puppycrawl/tools/checkstyle/checks/annotations/MyClass

// OK 「matchDirectoryStructure=false」なのでパッケージ名とディレクトリが合致するかどうかはチェックされない
package com.puppycrawl.tools.checkstyle.checks;

public class MyClass extends AbstractCheck {
}

ParameterAssignment

パラメータへの値の設定をしていないかチェックする。

プロパティ

なし

チェック設定例

<module name="ParameterAssignment"/>

チェック実行例

class MyClass {
    // NG メソッドの中でパラメータに値を設定している
    int methodOne(int parameter) {
        if (parameter <= 0 ) {
            throw new IllegalArgumentException("A positive value is expected");
        }
        parameter -= 2;
        return parameter;
  }
}

RequireThis

自身のクラスのインスタンス参照時に「this」が使用されていることをチェックする。

プロパティ

プロパティ デフォルト値 説明
checkFields boolean true フィールドへの参照をチェックするかどうか
checkMethods boolean true メソッドへの参照をチェックするかどうか
validateOnly Overlapping boolean true 変数や引数によるオーバーラップのみをチェックするかどうか

チェック設定例

プロパティ設定なし

<module name="RequireThis"/>

プロパティ設定あり

<module name="RequireThis">
    <property name="validateOnlyOverlapping" value="false"/>
</module>

チェック実行例

プロパティ設定なし

public class MyClass {
    private int a;
    private int b;
    private int c;

    // OK
    public Test(int a) {
        // OK
        this.a = a; 
        // OK 「validateOnlyOverlapping=true」なのでチェック対象外 
        b = 0;
        // OK 「validateOnlyOverlapping=true」なのでチェック対象外 
        foo(5);
    }

    public void foo(int c) {
        // NG thisが必要
        c = c;
    }
} 

プロパティ設定あり

public class MyClass {
    private int a;
    private int b;
    private int c;

    public Test(int a) {
        // OK
        this.a = a; 
        // NG thisが必要
        b = 0;
        // NG thisが必要
        foo(5);
    }

    public void foo(int c) {
        // NG thisが必要
        c = c;
    }
} 

ReturnCount

メソッド、コンストラクタ、ラムダ式での return 文の数を制限する。
プロパティで指定されたメソッドをチェック対象外とすることができる(デフォルト:equals)。

プロパティ

プロパティ デフォルト値 説明
max int 2 非voidメソッド/ラムダにおける return 文の最大数
maxForVoid int 1 voidメソッド/コンストラクタ/ラムダにおけるreturn文の最大数
format Pattern "^equals$" チェック対象外とするメソッドの正規表現
tokens トークンのサブセット CTOR_DEF, METHOD_DEF, LAMBDA チェック対象のトーク

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

説明
CTOR_DEF コンストラクタ宣言
LAMBDA ラムダ式->
METHOD_DEF メソッド宣言

チェック設定例

プロパティ設定なし

<module name="ReturnCount"/>

プロパティ設定あり

<module name="ReturnCount">
    <property name="max" value="1"/>
    <property name="maxForVoid" value="0"/>
</module>

チェック実行例

プロパティ設定なし

public class MyClass {
    // OK
    public void foo() {
        return;
    }

    // NG voidメソッドのreturnは1回まで
    public void foo(int x) {
        if (x == 0)
          return;
        return;
    }

    // OK
    public int hoge(int x) {
        if (x < 0)
            return -1;
        return 0;
    }

    // NG 非voidメソッドのreturnは2回まで
    public int hoge(int x) {
        if (x < 0)
            return -1;
        if (x == 0)
            return 1;
        return 0;
    }
}

プロパティ設定あり

public class MyClass {
    // OK
    public void foo() {
    }

    // NG 「maxForVoid=0」なのでvoidメソッドではreturnを記述しない
    public void foo(int x) {
        return;
    }

    // OK
    public int hoge(int x) {
        return 0;
    }

    // NG 「max=1」なので非voidメソッドのreturnは1回まで
    public int hoge(int x) {
        if (x < 0)
            return -1;
        return 0;
    }
}

SimplifyBooleanExpression

複雑すぎる真理値表現をチェックする。

〇 検出されるコード例

if (b == true)
b || true
!false
boolean a = q > 12 ? true : false

プロパティ

なし

チェック設定例

<module name="SimplifyBooleanExpression"/>

チェック実行例

public class MyClass {

    public void bar() {

        boolean a, b;
        Foo c, d, e;

        // NG
        if (!false) {};

        // NG
        if (a == true) {};
        // OK
        if (a == b) {};
        // NG
        if (!(a != true)) {};

        int s = 12;
        // NG
        boolean m = s > 1 ? true : false;
        // OK
        boolean f = c == null ? false : c.someMethod();
    }
}

SimplifyBooleanReturn

複雑すぎる boolean return 文をチェックする。

〇 検出されるコード

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

プロパティ

なし

チェック設定例

<module name="SimplifyBooleanReturn"/>

チェック実行例

public class MyClass {

    private boolean cond;
    private Foo a;
    private Foo b;

    // NG
    public boolean check1() {
        if (cond) {
            return true;
        } else {
            return false;
        }
    }

    // OK
    public boolean check2() {
        return cond;
    }
}

StringLiteralEquality

文字列の比較に==!=を使用していないことをチェックする。

プロパティ

なし

チェック設定例

<module name="StringLiteralEquality"/>

チェック実行例

String status = "pending";

// NG 文字列の比較に「==」を使用しない
if (status == "done") {}

// NG 文字列の比較に「!=」を使用しない
while (status != "done") {}

// OK
boolean flag = (status.equals("done"));

SuperClone

オーバーライドされた clone() メソッドが super.clone() を呼び出すかどうかをチェックする。

プロパティ

なし

チェック設定例

<module name="SuperClone"/>

チェック実行例

// OK
class A {
    public Object clone() {
        return super.clone();
    }
}

// NG super.clone()を呼び出していない
class B {
    private int b;

    public B clone() { 
        B other = new B();
        other.b = this.b;
        return other;
    }
}

SuperFinalize

オーバーライドされたfinalize()メソッドがsuper.finalize()を呼び出すかどうかをチェックする。

プロパティ

なし

チェック設定例

<module name="SuperFinalize"/>

チェック実行例

// OK
public class A {
    protected void finalize() throws Throwable {
        System.out.println("In finalize block");
        super.finalize();
    }
}

// NG super.finalize()を呼び出していない
public class B {
    protected void finalize() throws Throwable {
        System.out.println("In finalize block");
    }
}

UnnecessaryParentheses

ステートメントや式の中で不要な括弧が使われているかどうかをチェックする。

プロパティ

プロパティ デフォルト値 説明
tokens トークンのサブセット EXPR, IDENT, NUM_DOUBLE, NUM_FLOAT, NUM_INT, NUM_LONG, STRING_LITERAL, LITERAL_NULL, LITERAL_FALSE, LITERAL_TRUE, ASSIGN, BAND_ASSIGN, BOR_ASSIGN, BSR_ASSIGN, BXOR_ASSIGN, DIV_ASSIGN, MINUS_ASSIGN, MOD_ASSIGN, PLUS_ASSIGN, SL_ASSIGN, SR_ASSIGN, STAR_ASSIGN, LAMBDA, TEXT_BLOCK_LITERAL_BEGIN, LAND, LOR, LITERAL_INSTANCEOF, GT, LT, GE, LE, EQUAL, NOT_EQUAL, UNARY_MINUS, UNARY_PLUS, INC, DEC, LNOT, BNOT, POST_INC, POST_DEC チェック対象のトーク

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

説明
ASSIGN =
BAND_ASSIGN &=
BNOT ~
BOR_ASSIGN |=
BSR_ASSIGN >>>=
BXOR_ASSIGN ^=
DEC 前置--
DIV_ASSIGN /=
EQUAL ==
EXPR
GE >=
GT >
IDENT 識別子
INC 前置++
LAMBDA ->
LAND &&
LE <=
LITERAL_FALSE false
LITERAL_INSTANCEOF instanceof
LITERAL_NULL null
LITERAL_TRUE true
LNOT !
LOR ||
LT <
MINUS_ASSIGN -=
MOD_ASSIGN %=
NOT_EQUAL !=
NUM_DOUBLE 倍精度浮動小数リテラル
NUM_FLOAT 単精度浮動小数リテラル
NUM_INT 整数リテラル
NUM_LONG 長整数リテラル
PLUS_ASSIGN +=
POST_DEC 後置--
POST_INC 後置++
SL_ASSIGN <<=
SR_ASSIGN >>=
STAR_ASSIGN *=
STRING_LITERAL 文字列
TEXT_BLOCK_LITERAL_BEGIN テキストブロック開始の'''
UNARY_MINUS -
UNARY_PLUS +

チェック設定例

プロパティ設定なし

<module name="UnnecessaryParentheses"/>

プロパティ設定あり

<module name="UnnecessaryParentheses">
    <property name="tokens" value="PLUS_ASSIGN"/>
</module>

チェック実行例

プロパティ設定なし

public int square(int a, int b) {
    // NG ()不要
    int square = (a * b);
    // NG ()不要
    return (square);
}

int sumOfSquares = 0;
// NG ()不要
for(int i = (0); i < 10; i++){
  // NG ()不要
  int x = (i + 1);
  // NG ()不要
  sumOfSquares += (square(x * x));
}

プロパティ設定あり

public int square(int a, int b) {
    // OK チェック対象外
    int square = (a * b);
    // OK チェック対象外
    return (square);
}

int sumOfSquares = 0;
// OK チェック対象外
for(int i = (0); i < 10; i++){
  // OK チェック対象外
  int x = (i + 1);
  // NG ()不要
  sumOfSquares += (square(x * x));
}

UnnecessarySemicolonAfterOuterTypeDeclaration

型宣言の後に不要なセミコロンが使用されていないかどうか

プロパティ

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

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

説明
ANNOTATION_DEF アノテーション宣言
CLASS_DEF クラス宣言
ENUM_DEF enum宣言
INTERFACE_DEF インターフェース宣言
RECORD_DEF レコード宣言

チェック設定例

プロパティ設定なし

<module name="UnnecessarySemicolonAfterOuterTypeDeclaration"/>

プロパティ設定あり

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

チェック実行例

プロパティ設定なし

// OK 内部クラスはチェック対象外
class A {
   class Nested {
   };
}

// NG インターフェース宣言後にセミコロンは不要
interface B {
}; 

プロパティ設定あり

// NG クラス宣言後のセミコロンは不要
class A {
};

// OK インターフェースはチェック対象外
interface B {
};

UnnecessarySemicolonAfterTypeMemberDeclaration

クラスのメンバー宣言の後に不要なセミコロンが使用されていないかをチェックする。

プロパティ

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

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

説明
ANNOTATION_DEF アノテーション宣言
ANNOTATION_FIELD_DEF アノテーションフィールド宣言
CLASS_DEF クラス宣言
COMPACT_CTOR_DEF デフォルトコンストラク
CTOR_DEF コンストラクタ宣言
ENUM_CONSTANT_DEF Enum定数宣言
ENUM_DEF Enum宣言
INSTANCE_INIT インスタンスイニシャライザ
INTERFACE_DEF インターフェース宣言
METHOD_DEF メソッド宣言
RECORD_DEF レコード宣言
STATIC_INIT スタティックイニシャライザ
VARIABLE_DEF フィールドまたはローカル変数の宣言

チェック設定例

プロパティ設定なし

<module name="UnnecessarySemicolonAfterTypeMemberDeclaration"/>

プロパティ設定あり

<module name="UnnecessarySemicolonAfterTypeMemberDeclaration">
    <property name="tokens" value="CTOR_DEF"/>
</module>

チェック実行例

プロパティ設定なし

class MyClass {
    // NG 不要なセミコロン
    ;
    // NG 不要なセミコロン
    {};
    // NG 不要なセミコロン
    static {};
    
    // NG 不要なセミコロン
    MyClass(){};
    
    // NG 不要なセミコロン
    void method() {};
    
    // NG 過剰なセミコロン
    int field = 10;;

    // OK
    {
        ;
    }

    // OK
    static {
        ;
    }

    void anotherMethod() {
        // OK
        ;
        
        // OK
        if(true);
    }
}

プロパティ設定あり

class MyClass {

    // OK チェック対象外
    {};
    // OK チェック対象外
    static {};
    
    // NG 不要なセミコロン
    MyClass(){};
    
    // OK チェック対象外
    void method() {};
}

UnnecessarySemicolonInEnumeration

enumの定義に不要なセミコロンがあるかどうかをチェックする。

プロパティ

なし

チェック設定例

<module name="UnnecessarySemicolonInEnumeration"/>

チェック実行例

// NG 不要なセミコロン
enum One {
    A,B;
}

// NG 不要なセミコロン
enum Two {
    A,B,;
}

// NG 不要なセミコロン
enum Three {
    A,B();
}

// NG 不要なセミコロン
enum Four {
    A,B{};
}

// NG 不要なセミコロン
enum Five {
    A,
    B
    ;
}

// OK コンストラクタが宣言されている場合はセミコロンが必要
enum Normal {
    A,
    B,
    ;
    Normal(){}
}

// OK enum定数のみの場合はセミコロン不要
enum NoSemicolon {
    A, B
}

UnnecessarySemicolonInTryWithResources

try-with-resourceの最後のリソース宣言で不要なセミコロンが使用されていないかをチェックする。

プロパティ

プロパティ デフォルト値 説明
allowWhenNoBrace AfterSemicolon boolean true セミコロンと閉じ括弧が同じ行にない場合、不要なセミコロンを許容するかどうか

チェック設定例

プロパティ設定なし

<module name="UnnecessarySemicolonInTryWithResources"/>

プロパティ設定あり

<module name="UnnecessarySemicolonInTryWithResources">
    <property name="allowWhenNoBraceAfterSemicolon" value="false"/>
</module>

チェック実行例

プロパティ設定なし

class MyClass {
    void foo() throws IOException {
        // NG 不要なセミコロン
        try(Reader r1 = new PipedReader();){}
        
        // NG 不要なセミコロン
        try(Reader r4 = new PipedReader();Reader r5 = new PipedReader()
        ;){}
        
        // OK 閉じ括弧とセミコロンが別行の場合許容される
        try(Reader r6 = new PipedReader();
            Reader r7
                   = new PipedReader();
        ){}
    }
}

プロパティ設定あり

class MyClass {
    void foo() throws IOException {
        // NG 不要なセミコロン
        try(Reader r1 = new PipedReader();){}
        
        // NG 不要なセミコロン
        try(Reader r6 = new PipedReader();
            Reader r7 = new PipedReader();
        ){}
    }
}

UnusedLocalVariable

使用されていないローカル変数をチェックする。

プロパティ

なし

チェック設定例

<module name="UnusedLocalVariable"/>

チェック実行例

class MyClass {

    int a;

    {
        // NG 使用されていない
        int k = 12;
        k++;
    }

    void method(int b) {
        // NG 使用されていない
        int a = 10;
        
        // NG 使用されていない
        int[] arr = {1, 2, 3};
        
        // OK
        int[] anotherArr = {1};
        anotherArr[0] = 4;
    }
}

VariableDeclarationUsageDistance

変数が宣言されてから、最初に使用されるまでの距離をチェックする。

プロパティ

プロパティ デフォルト値 説明
allowedDistance int 3 変数が宣言されてから最初に使用されるまでの距離
ignoreVariable Pattern Pattern "" 変数の距離計算を無視する変数の正規表現
validateBetween Scopes boolean false 変数の宣言から、異なるスコープで最初に使用されるまでの距離を計算できるようにするかどうか
ignoreFinal boolean true final修飾子を持つ変数を無視するかどうか

チェック設定例

プロパティ設定なし

<module name="VariableDeclarationUsageDistance"/>

プロパティ設定あり

<module name="VariableDeclarationUsageDistance">
    <property name="allowedDistance" value="4"/>
    <property name="ignoreVariablePattern" value="^num$"/>
    <property name="validateBetweenScopes" value="true"/>
    <property name="ignoreFinal" value="false"/>
</module>

チェック実行例

プロパティ設定なし

public class MyClass {

    public void foo1() {
        // NG 距離が4離れている
        int num;
        
        // OK finalな変数はチェックしない
        final int PI;
        
        System.out.println("Statement 1");
        System.out.println("Statement 2");
        System.out.println("Statement 3");
        num = 1;
        PI = 3.14;
    }

    public void foo2() {
        // OK 異なるスコープで使用されているのでチェックしない
        int a;
        // OK 異なるスコープで使用されているのでチェックしない
        int b;
        // OK 異なるスコープで使用されているのでチェックしない
        int count = 0;

        {
            System.out.println("Inside inner scope");
            a = 1;
            b = 2;
            count++;
        }
    }
}

プロパティ設定あり

public class MyClass {

    public void foo1() {
        // OK プロパティによりチェック対象外
        int num;
        
        // NG 距離が5離れている 「ignoreFinal=false」のためチェック対象
        final int PI;
        
        System.out.println("Statement 1");
        System.out.println("Statement 2");
        System.out.println("Statement 3");
        num = 1;
        System.out.println("Statement 4");
        PI = 3.14;
    }

    public void foo2() {
        // OK
        int a;
        // OK
        int b;
        // NG 距離が離れすぎている 「validateBetweenScopes=true」のためチェック対象
        int count = 0;

        {
            System.out.println("Inside inner scope1");
            a = 1;
            b = 2;
            System.out.println("Inside inner scope2");
            System.out.println("Inside inner scope3");
            count++;
        }
    }
}