Checkstyle チェック項目ーMiscellaneous

Checkstyleチェック項目:Miscellaneous

CheckStyle公式ドキュメント

ver 10.3.1

ArrayTypeStyle

配列の型定義のスタイルをチェックする。
JavaスタイルとCスタイルから選択可能。

  • Javaスタイル(デフォルト):public static void main(String args)
  • Cスタイル:public static void main(String args)

プロパティ

プロパティ デフォルト値 説明
javaStyle boolean true Javaスタイル(true)とCスタイル(false)のどちらを強制するか

チェック設定例

プロパティ設定なし

<module name="ArrayTypeStyle"/>

プロパティ設定あり

<module name="ArrayTypeStyle">
    <property name="javaStyle" value="false"/>
</module>

チェック実行例

プロパティ設定なし

public class MyClass {
    // OK
    int[] nums;
    
    // NG Cスタイル
    String strings[];

    // OK
    char[] toCharArray() {
        return null;
    }

    // NG Cスタイル
    byte getData()[] {
        return null;
    }
}

プロパティ設定あり

public class MyClass {
    // NG Javaスタイル
    int[] nums;
    
    // OK
    String strings[];

    // NG Javaスタイル
    char[] toCharArray() {
        return null;
    }

    // OK
    byte getData()[] {
        return null;
    }
}

AvoidEscapedUnicodeCharacters

Unicodeエスケープ(ex. \u221e)の使用を制限する。

プロパティ

プロパティ デフォルト値 説明
allowEscapesForControlCharacters boolean false 印字不可能な制御文字にエスケープを使用できるようにするかどうか
allowByTailComment boolean false トレイルコメント(コードと同行のコメント)が存在する場合、エスケープを使用できるようにするかどうか
allowIfAllCharactersEscaped boolean false リテラル内のすべての文字がエスケープされている場合にエスケープを使用できるようにするかどうか
allowNonPrintableEscapes boolean false 印字不可能な空白文字にエスケープを使用できるようにするかどうか

チェック設定例

プロパティ設定なし

<module name="AvoidEscapedUnicodeCharacters"/>

プロパティ設定あり

<module name="AvoidEscapedUnicodeCharacters">
    <property name="allowByTailComment" value="true"/>
</module>

チェック実行例

プロパティ設定なし

// OK
String unitAbbrev = "μs";
// NG
String unitAbbrev = "\u03bcs";
// OK
return '\ufeff' + content; 

プロパティ設定あり

String unitAbbrev = "μs";      // OK, a normal String
String unitAbbrev = "\u03bcs"; // OK, Greek letter mu, "s"
return '\ufeff' + content;
// -----^--------------------- NG, comment is not used within same line.

CommentsIndentation

コメントと周囲のコードとの間のインデントを制御する。
コメントは周囲のコードと同じレベルでインデントされる。

プロパティ

プロパティ デフォルト値 説明
tokens トークンの サブセット SINGLE_LINE_COMMENT, BLOCK_COMMENT_BEGIN チェック対象のトーク

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

説明
SINGLE_LINE_COMMENT //
BLOCK_COMMENT_BEGIN /*

チェック設定例

プロパティ設定なし

<module name="CommentsIndentation"/>

プロパティ設定あり

<module name="CommentsIndentation">
    <property name="tokens" value="SINGLE_LINE_COMMENT"/>
</module>

チェック実行例

プロパティ設定なし

/*
 * OK
 */
boolean bool = true;

  /* NG
   * doubleと同じインデントにするべき
   */
double d = 3.14;

プロパティ設定あり

/*
 * OK
 */
boolean bool = true;

  /* OK
   * ブロックコメントはチェック対象外
   */
double d = 3.14;

DescendantToken

他のトークンの下に制限されたトークンがあるかどうかをチェックする。

プロパティ

プロパティ デフォルト値 説明
limitedTokens トークンの サブセット {} 出現回数が制限されているトークンのサブセット
minimumDepth int 0 子孫カウントの最小深度
maximumDepth int 2147483647 子孫カウントの最大深度
minimumNumber int 0 子孫の最小数を指定
maximumNumber int 2147483647 子孫の最大数を指定
sumTokenCounts boolean false 検出されたトークンの数を個々のトークン数の合計から計算するかどうか
minimumMessage String null 最小カウントに達しない場合の違反メッセージ
maximumMessage String null 最大カウントに達しない場合の違反メッセージ
tokens トークンの サブセット empty チェック対象のトーク

チェック設定例

プロパティ設定なし

<module name="CommentsIndentation"/>

プロパティ設定あり

<module name="DescendantToken">
    <property name="tokens" value="LITERAL_SWITCH"/>
    <property name="maximumDepth" value="2"/>
    <property name="limitedTokens" value="LITERAL_DEFAULT"/>
    <property name="minimumNumber" value="1"/>
</module>

チェック実行例

プロパティ設定なし

プロパティ設定がない場合チェックは行われない

プロパティ設定あり

// defaultがないのでNG
switch(num){
  case 1:
    System.out.println("Aクラス");
    break;
  case 2:
    System.out.println("Bクラス");
    break;
  case 3:
    System.out.println("Cクラス");
}

FinalParameters

メソッド、コンストラクタ、catch、for-each ブロックのパラメータが final であるかどうかをチェックする。

プロパティ

プロパティ デフォルト値 説明
ignorePrimitiveTypes boolean false プリミティブ型のパラメータをチェック対象外にするかどうか
tokens トークンの サブセット METHOD_DEF, CTOR_DEF チェック対象のトーク

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

説明
METHOD_DEF メソッド宣言
CTOR_DEF コンストラクタ宣言
LITERAL_CATCH catch
FOR_EACH_CLAUSE 拡張for文

チェック設定例

プロパティ設定なし

<module name="FinalParameters"/>

プロパティ設定あり

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

チェック実行例

プロパティ設定なし

public class Point {
    // OK
    public Point() {
    }
    
    // OK
    public Point(final int m) {  
    }
  
    // NG パラメータはfinalで宣言する
    public Point(final int m, int n) {
    }
    
    // OK
    public void methodOne(final int x) {
    }
    
    // NG パラメータはfinalで宣言する
    public void methodTwo(int x) { 
    }
    
    // NG パラメータはfinalで宣言する
    public static void main(String[] args) {
    }
}

プロパティ設定あり

public class Point {
    // OK
    public Point() {
    }
    
    // OK
    public Point(final int m) {  
    }
  
    // NG パラメータはfinalで宣言する
    public Point(final int m, int n) {
    }
    
    // OK
    public void methodOne(final int x) {
    }
    
    // OK メソッドはチェック対象外
    public void methodTwo(int x) { 
    }
    
    // OK メソッドはチェック対象外
    public static void main(String[] args) {
    }
}

Indentation

Javaコードのインデントが正しいかどうかをチェックする。

プロパティ

プロパティ デフォルト値 説明
basicOffset int 4 新しいインデントレベルを次の行でどの程度インデントさせるか
braceAdjustment int 0 次の行に移動するときに、中括弧をどの程度インデントさせるか
caseIndent int 4 次の行に移動するときに、caseをどの程度インデントさせるか
throwsIndent int 4 throws節が次の行に来たときに、どの程度インデントさせるか
arrayInitIndent int 4 配列の初期化を次の行で行う際のインデント幅
lineWrappingIndentation int 4 改行がある場合、継続行をどの程度インデントするか
forceStrictCondition boolean false 行の折り返しがある場合、厳密なインデントレベルを強制するかどうか

チェック設定例

プロパティ設定なし

<module name="Indentation"/>

プロパティ設定あり

<module name="Indentation">
    <property name="caseIndent" value="0"/>
</module>

チェック実行例

プロパティ設定なし

// OK
void foo() {
    switch (field) {
        case "value" : bar();
    }
}

プロパティ設定あり

// OK
void foo() {
    switch (field) {
    case "value" : bar();
    }
}

NewlineAtEndOfFile

ファイルの末尾がラインセパレータであるかどうかをチェックする。

プロパティ

プロパティ デフォルト値 説明
lineSeparator LineSeparatorOption lf_cr_crlf ラインセパレーターの種類を指定
fileExtensions String[] all files チェックするファイルの拡張子を指定

〇LineSeparatorOptionには以下の値が設定可能

  • crlf
  • cr
  • lf
  • lf_cr_crlf
  • system

チェック設定例

プロパティ設定なし

<module name="NewlineAtEndOfFile"/>

プロパティ設定あり

<module name="NewlineAtEndOfFile">
    <property name="lineSeparator" value="lf"/>
</module>

チェック実行例

// NG
public class Test1 {⤶
⤶
}

// OK
public class Test {⤶
⤶
}⤶ 

NoCodeInFile

ファイルがコードを含んでいるかどうかをチェックする。

プロパティ

なし

チェック設定例

<module name="NoCodeInFile"/>

チェック実行例

// NG コメントのみでコードが含まれていない
// single-line comment

OrderedProperties

プロパティファイルのキーが正しい順番で並んでいるかどうかをチェックする。

プロパティ

プロパティ デフォルト値 説明
fileExtensions String[] .properties チェック対象のファイルの拡張子

チェック設定例

プロパティ設定なし

<module name="OrderedProperties"/>

プロパティ設定あり

<module name="OrderedProperties">
    <property name="fileExtensions" value=".properties"/>
</module>

チェック実行例

A =65
a =97
key =107 than nothing
key.sub =k is 107 and dot is 46
key.png =value
# NG key.pngはkey.subより上に記述するべき

OuterTypeFilename

外側の型名とファイル名が一致するかどうかをチェックする。

プロパティ

なし

チェック設定例

<module name="OuterTypeFilename"/>

チェック実行例

Test.java

// OK
public class Test {
}

// NG MyClass.javaであるべき
public class MyClass {
}

TodoComment

TODO:コメントに対するチェックを行う。

プロパティ

プロパティ デフォルト値 説明
format Pattern "TODO:" コメントのマッチングに使用する正規表現

チェック設定例

プロパティ設定なし

<module name="TodoComment"/>

プロパティ設定あり

<module name="TodoComment">
    <property name="format" value="(TODO)|(FIXME)"/>
</module>

チェック実行例

プロパティ設定なし

// NG
i++; // TODO: do differently in future
// OK
i++; // todo: do differently in future

プロパティ設定あり

// NG
i++;   // TODO: do differently in future
// OK
i++;   // todo: do differently in future
// NG
i=i/x; // FIXME: handle x = 0 case
// OK
i=i/x; // FIX :  handle x = 0 case 

TrailingComment

コードのある行がコメントで終わっていないことをチェックする。
//コメントの場合、その前に空白のみが存在することをチェックする。

プロパティ

プロパティ デフォルト値 説明
format Pattern "^[\s});]*$" コメントの前に許容される文字列のパターンを指定
legalComment Pattern null 末尾のコメントで許可されるテキストのパターンを指定

チェック設定例

プロパティ設定なし

<module name="TrailingComment"/>

プロパティ設定あり

<module name="TrailingComment">
    <property name="format" value="^\\s*$"/>
</module>

チェック実行例

int a; // Comment! NG

Translation

プロパティファイルのキーに関する一貫性をチェックすることにより、コードの正しい翻訳をチェックする。
1つの同じコンテキストを記述する2つのプロパティファイルは、同じキーを含んでいれば一貫性があると判断される。
多言語対応している場合などに、プロパティファイルに同一のキーがきちんと含まれていることをチェックするのに用いる。

プロパティ

プロパティ デフォルト値 説明
fileExtensions String[] .properties 翻訳ファイルを識別するためのファイルタイプ拡張子を指定
baseName Pattern "^messages.*$" メッセージリソースを含むリソースバンドルのベース名を指定
requiredTranslations String[] {} プロジェクトに存在する、必要な翻訳の言語コードを指定

チェック設定例

プロパティ設定なし

<module name="TrailingComment"/>

プロパティ設定あり

<module name="Translation">
    <property name="fileExtensions" value="properties, translations"/>
</module>

チェック実行例

#messages.properties
hello=Hello
cancel=Cancel

#messages_de.properties
hell=Hallo
ok=OK

上記の2ファイルが存在する場合、以下のようにそれぞれのファイルでのみ存在するキーがNGとなり検出される。

messages_de.properties: Key 'hello' missing.
messages_de.properties: Key 'cancel' missing.
messages.properties: Key 'hell' missing.
messages.properties: Key 'ok' missing.

UncommentedMain

コメントアウトされていないメインメソッドを検出する。

プロパティ

プロパティ デフォルト値 説明
excludedClasses Pattern "^$" mainメソッドを持つことが許されるクラスの修飾名のパターンを指定

チェック設定例

プロパティ設定なし

<module name="UncommentedMain"/>

プロパティ設定あり

<module name="UncommentedMain">
    <property name="excludedClasses" value="\.Main$"/>
</module>

チェック実行例

プロパティ設定なし

// NG
public class Main {
   public static void main(String[] args){}
}

// OK
public class Launch {
   //public static void main(String[] args){}
}

プロパティ設定あり

// OK 「excludedClasses」で指定のクラスなのでOK
public class Main {
   public static void main(String[] args){}
}

// OK
public class Launch {
   //public static void main(String[] args){}
}

UniqueProperties

プロパティファイルのキーの重複を検出する。

プロパティ

プロパティ デフォルト値 説明
fileExtensions String[] .properties チェックするファイルの拡張子を指定

チェック設定例

プロパティ設定なし

<module name="UniqueProperties"/>

プロパティ設定あり

<module name="UniqueProperties">
    <property name="fileExtensions" value="customProperties"/>
</module>

チェック実行例

key.one=44
key.two=32
key.one=54 // NG キーが重複している

UpperEll

longの変数に付与する「L」が大文字で記述されているかどうかをチェックする。

プロパティ

なし

チェック設定例

<module name="UpperEll"/>

チェック実行例

class MyClass {
    // OK
    long var1 = 508987;
    // NG 「L」が小文字
    long var2 = 508987l;
    // OK
    long var3 = 508987L;
}

Checkstyle チェック項目ーMetrics

Checkstyleチェック項目:Metrics

CheckStyle公式ドキュメント

ver 10.3.1

BooleanExpressionComplexity

式中のboolean演算子(&&、 ||、 &、 |、 ^)の数を制限する。

プロパティ

プロパティ デフォルト値 説明
max int 3 1つの式で許可されるboolean演算の最大数
tokens トークンの サブセット LAND,
BAND,
LOR,
BOR,
BXOR
チェック対象のトーク

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

説明
LAND &&
BAND &
LOR ||
BOR |
BXOR ^

チェック設定例

プロパティ設定なし

<module name="BooleanExpressionComplexity"/>

プロパティ設定あり

<module name="BooleanExpressionComplexity">
    <property name="max" value="5"/>
</module>

チェック実行例

プロパティ設定なし

public class Test {
    public static void main(String ... args) {
        boolean a = true;
        boolean b = false;

        // OK
        boolean c = (a & b) | (b ^ a);
        // NG boolean演算子は3個まで
        boolean d = (a & b) ^ (a || b) | a;
  }
}

プロパティ設定あり

public class Test {
    public static void main(String ... args) {
        boolean a = true;
        boolean b = false;

        // OK
        boolean c = (a & b) | (b ^ a) | (a ^ b);
        // NG boolean演算子は5個まで
        boolean d = (a | b) ^ (a | b) ^ (a || b) & b;
  }
}

ClassDataAbstractionCoupling

与えられたクラスまたはレコード内で、他のクラスのインスタンス化の数を計測する。
一般に、他のデータ型をメンバやローカル変数として持つデータ型で、他のクラスのインスタンス化(オブジェクト)であるものは、データ抽象化結合(DAC)を持ち、DACが高いほどクラスの構造は複雑だといわれている。

プロパティ

プロパティ デフォルト値 説明
max int 7 許容される最大閾値を指定
excludedClasses String[] ArrayIndexOutOfBoundsException,
ArrayList,
Boolean,
Byte,
Character,
Class,
Collection,
Deprecated,
Deque,
Double,
DoubleStream,
EnumSet,
Exception,
Float,
FunctionalInterface,
HashMap,
HashSet,
IllegalArgumentException,
IllegalStateException,
IndexOutOfBoundsException,
IntStream,
Integer,
LinkedHashMap,
LinkedHashSet,
LinkedList,
List,
Long,
LongStream,
Map,
NullPointerException,
Object,
Optional,
OptionalDouble,
OptionalInt,
OptionalLong,
Override,
Queue,
RuntimeException,
SafeVarargs,
SecurityException,
Set,
Short,
SortedMap,
SortedSet,
Stream,
String,
StringBuffer,
StringBuilder,
SuppressWarnings,
Throwable,
TreeMap,
TreeSet,
UnsupportedOperationException,
Void,
boolean,
byte,
char,
double,
float,
int,
long,
short,
var,
void
カウント対象外とするクラス名を指定
excludeClassesRegexps Pattern[] ^$ カウント対象外とするクラス名の正規表現を指定
excludedPackages String[] {} カウント対象外とするパッケージ名を指定

チェック設定例

プロパティ設定なし

<module name="ClassDataAbstractionCoupling"/>

プロパティ設定あり

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

チェック実行例

プロパティ設定なし

// NG 8クラス使用されている
class MyClass {
    Date date = new Date();
    Time time = new Time();
    Foo foo = new Foo();
    Bar bar = new Bar();
    Fizz fizz = new Fizz();
    Buzz buzz = new Buzz();
    Animal animal = new Animal();
    Place place = new Place();
}

プロパティ設定あり

// NG 3クラス使用されている
class MyClass {
    Date date = new Date();
    Time time = new Time();
    Place place = new Place();
}

ClassFanOutComplexity

与えられたクラス/レコード/インターフェース/enum/アノテーションが依存している他の型の数をチェックする。

プロパティ

プロパティ デフォルト値 説明
max int 20 許容される最大閾値を指定
excludedClasses String[] ArrayIndexOutOfBoundsException,
ArrayList,
Boolean,
Byte,
Character,
Class,
Collection,
Deprecated,
Deque,
Double,
DoubleStream,
EnumSet,
Exception,
Float,
FunctionalInterface,
HashMap,
HashSet,
IllegalArgumentException,
IllegalStateException,
IndexOutOfBoundsException,
IntStream,
Integer,
LinkedHashMap,
LinkedHashSet,
LinkedList,
List,
Long,
LongStream,
Map,
NullPointerException,
Object,
Optional,
OptionalDouble,
OptionalInt,
OptionalLong,
Override,
Queue,
RuntimeException,
SafeVarargs,
SecurityException,
Set,
Short,
SortedMap,
SortedSet,
Stream,
String,
StringBuffer,
StringBuilder,
SuppressWarnings,
Throwable,
TreeMap,
TreeSet,
UnsupportedOperationException,
Void,
boolean,
byte,
char,
double,
float,
int,
long,
short,
var,
void
カウント対象外とするクラス名を指定
excludeClassesRegexps Pattern[] ^$ カウント対象外とするクラス名の正規表現を指定
excludedPackages String[] {} カウント対象外とするパッケージ名を指定

チェック設定例

プロパティ設定なし

<module name="ClassFanOutComplexity"/>

プロパティ設定あり

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

チェック実行例

プロパティ設定なし

// NG 21クラス使用されている
class MyClass {
    Date date = new Date();
    Time time = new Time();
    // ・・・他に18クラス使用されていたとする
    
    // 21クラス目の使用
    Place place = new Place();
}

プロパティ設定あり

// NG 3クラス使用されている
class MyClass {
    Date date = new Date();
    Time time = new Time();
    Place place = new Place();
}

CyclomaticComplexity

サイクロマティック複雑度を、指定された制限値に対してチェックする。
これは、ソースを通過できるパスの最小数と必要なテストの数を表すものであり、 コードの品質とは関係がない。
メソッド、コンストラクタ、スタティックイニシャライザ、インスタンスイニシャライザのみに適用される。

ソースコード中にif, while , do, for, ?:, catch, switch, case文、演算子 &&, ||が出てくると「+1」される。
理論的には、1-4はテストが容易、5-7はOK、8-10はテストを容易にするためのリファクタリングを考慮、11以上はリファクタリングが必要となる。

プロパティ

プロパティ デフォルト値 説明
max int 10 許容される最大閾値を指定
switchBlockAsSingleDecisionPoint boolean false スイッチブロック全体を1つの判定点として扱うかどうか
tokens トークンの サブセット LITERAL_WHILE,
LITERAL_DO,
LITERAL_FOR,
LITERAL_IF,
LITERAL_SWITCH,
LITERAL_CASE,
LITERAL_CATCH,
QUESTION,
LAND,
LOR
チェック対象のトーク

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

説明
LAND &&
LOR ||
LITERAL_WHILE while
LITERAL_DO do
LITERAL_FOR for
LITERAL_IF if
LITERAL_SWITCH switch
LITERAL_CASE case
LITERAL_CATCH catch
QUESTION ?

チェック設定例

プロパティ設定なし

<module name="CyclomaticComplexity"/>

プロパティ設定あり

<module name="CyclomaticComplexity">
    <property name="max" value="4"/>
    <property name="tokens" value="LITERAL_WHILE, LITERAL_DO"/>
</module>

チェック実行例

プロパティ設定なし

// サイクロマティック複雑度が11なのでNG
class MyClass {
    int a, b, c, d, n;

    public void foo() { // 1
        if (a == 1) { // 2
            fun1();
        } else if (a == b // 3
            && a == c) { // 4
            if (c == 2) { // 5
                fun2();
            }
        } else if (a == d) { // 6
            try {
                fun4();
            } catch (Exception e) { // 7
            }
        } else {
            switch(n) {
                case 1: // 8
                    fun1();
                    break;
                case 2: // 9
                    fun2();
                    break;
                case 3: // 10
                    fun3();
                    break;
                default:
                    break;
            }
        }
        d = a < 0 ? -1 : 1; // 11
    }
}

プロパティ設定あり

// サイクロマティック複雑度が5なのでNG
class MyClass {

    int a, b, c, d;
    
    public void foo() { // 1
        while (a < b // 2
            && a > c) {
          fun();
        }
        if (a == b) {
            do { // 3
                fun();
            } while (d);
        } else if (c == d) {
            while (c > 0) { // 4
                fun();
            }
            do { // 5
                fun();
            } while (a);
        }    
    }
}

JavaNCSS

Non Commenting Source Statements (NCSS) をカウントすることによって、メソッド、クラス、ファイルの複雑さを判定する。
このチェックは、JavaNCSS-Toolの仕様に準拠している。 NCSSの指標はコメントでないソース行を数えることで算出される。

プロパティ

プロパティ デフォルト値 説明
methodMaximum int 50 メソッドのコメントを除く行の最大許容数
classMaximum int 1500 クラスのコメントを除く行の最大許容数
fileMaximum int 2000 1Javaファイルのコメントを除く行の最大許容数
recordMaximum int 150 レコードのコメントを除く行の最大許容数

チェック設定例

プロパティ設定なし

<module name="JavaNCSS"/>

プロパティ設定あり

<module name="JavaNCSS">
    <property name="methodMaximum" value="2"/>
</module>

チェック実行例

プロパティ設定なし

public void foo() {
    System.out.println("Line 1");
    // 同様のコードが48行あったとする
    System.out.println("Line 50")
    // NG メソッドのコメント以外の行が50行を超えている
    System.out.println("Line 51")
}

プロパティ設定あり

public void foo() {
    System.out.println("Line 1");
    System.out.println("Line 2")
    // NG メソッドのコメント以外の行が2行を超えている
    System.out.println("Line 3")
}

NPathComplexity

NPATHの複雑さを指定された制限値に対してチェックする。
NPATH メトリックは、メソッドを通過する可能な実行パスの数を計算する。

NPATHについては「NPATH: a measure of execution pathcomplexity and its applications」を参照の事。

プロパティ

プロパティ デフォルト値 説明
max int 200 許容される最大閾値を指定

チェック設定例

プロパティ設定なし

<module name="NPathComplexity"/>

プロパティ設定あり

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

Checkstyle チェック項目ーJavadoc Comments

Checkstyleチェック項目:Javadoc Comments

CheckStyle公式ドキュメント

ver 10.3.1

AtclauseOrder

JavadocブロックタグまたはJavadocタグの順序をチェックする。

プロパティ

プロパティ デフォルト値 説明
violateExecution OnNonTightHtml boolean false JavadocTight-HTMLルールに違反している場合、違反を表示するタイミングを制御するかどうか
target トークンの サブセット CLASS_DEF, COMPACT_CTOR_DEF, CTOR_DEF, ENUM_DEF, INTERFACE_DEF, METHOD_DEF, RECORD_DEF, VARIABLE_DEF 対象となるブロックタグを指定する
tagOrder String[] @author, @deprecated, @exception, @param, @return, @see, @serial, @serialData, @serialField, @since, @throws, @version タグの順番を指定する

チェック設定例

プロパティ設定なし

<module name="AtclauseOrder"/>

プロパティ設定あり

<module name="JavadocBlockTagLocation">
    <property name="tagOrder" value="@throws, @author, @deprecated, @exception, @param, @return, @see, @serial, @serialData, @serialField, @since, @version"/>
</module>

チェック実行例

プロパティ設定なし

// OK
/**
* Some javadoc.
*
* @author Some javadoc.
* @version Some javadoc.
* @param Some javadoc.
* @return Some javadoc.
* @throws Some javadoc.
* @exception Some javadoc.
* @see Some javadoc.
* @since Some javadoc.
* @serial Some javadoc.
* @serialField
* @serialData
* @deprecated Some javadoc.
*/
class MyClass implements Serializable {
}

// NG
/**
* Some javadoc.
*
* @since Some javadoc. // OK
* @version Some javadoc. // NG tagOrderの順番と異なる
* @deprecated
* @see Some javadoc. // NG tagOrderの順番と異なる
* @author Some javadoc. // NG tagOrderの順番と異なる
*/
class MyClass implements Serializable {
}

プロパティ設定あり

// NG
/**
* Some javadoc.
*
* @author Some javadoc.
* @version Some javadoc.
* @param Some javadoc.
* @return Some javadoc.
* @throws Some javadoc. // NG tagOrderの順番と異なる
* @exception Some javadoc.
* @see Some javadoc.
* @since Some javadoc.
* @serial Some javadoc.
* @serialField
* @serialData
* @deprecated Some javadoc.
*/
class MyClass implements Serializable {
}

InvalidJavadocPosition

Javadoc が正しい位置に配置されているかどうかをチェックする。
Documentation Comment Specification for the Standard Doclet で指定されているように、Javadoc はモジュール、パッケージ、クラス、インタフェース、コンストラクタ、メソッド、またはフィールド宣言の直前に置かれた場合のみ、正しく認識される。
メソッドの内部などそれ以外の位置では、このチェックでは無効と見なされる。

プロパティ

なし

チェック設定例

<module name="InvalidJavadocPosition"/>

チェック実行例

// NG アノテーションの上に記述する
@SuppressWarnings("serial")
/**
 * This comment looks like javadoc but it at an invalid location.
 * Therefore, the text will not get into TestClass.html and the check will produce a violation.
 */
public class TestClass {
}

JavadocBlockTagLocation

Javadocのブロックタグが行頭にのみ現れるかどうかをチェックする。
ブロックタグは、@記号で始まり、空白が前にあるトークンの事を指す。
このチェックでは、先頭のアスタリスクと空白、コメントやインラインタグ {@code} と {@literal} 内のブロックタグは無視される。

プロパティ

プロパティ デフォルト値 説明
tags String[] author, deprecated, exception, hidden, param, provides, return, see, serial, serialData, serialField, since, throws, uses, version チェックするJavadocタグを指定する
violateExecutionOnNonTightHtml boolean false JavadocTight-HTMLルールに違反している場合、違反を表示するタイミングを制御するかどうか

チェック設定例

プロパティ設定なし

<module name="JavadocBlockTagLocation"/>

プロパティ設定あり

<module name="JavadocBlockTagLocation">
    <property name="tags" value="apiNote, implSpec, implNote"/>
</module>

チェック実行例

プロパティ設定なし

/**
 * Escaped tag &#64;version
 * Plain text with {@code @see}
 * A @custom tag
 * 
 * email@author
 * (@param in parentheses)
 * '@param in single quotes'
 * @since 1.0
 * text @return (NG:行頭にない)
 * * @param (NG:行頭にない)
+* @serial (NG:行頭にない)
 * @see first @see second (NG:行頭にない)
 */
public int field;

プロパティ設定あり

/**
 * Escaped tag &#64;version
 * Plain text with {@code @see}
 * A @custom tag
 * 
 * email@author
 * (@param in parentheses)
 * '@param in single quotes'
 * @since 1.0
 * text @return (OK:チェック対象外)
 * * @param (OK:チェック対象外)
+* @serial (OK:チェック対象外)
 * @see first @see second (OK:チェック対象外)
 */
public int field;

JavadocContentLocation

プロジェクト内のすべての Javadoc コメントで、Javadocコンテンツが同じ位置から始まるかどうかをチェックする。
先頭のアスタリスクやスペースは、コンテンツの開始位置としてカウントされないため、無視される。

プロパティ

プロパティ デフォルト値 説明
location JavadocContentLocationOption second_line Javadoc コンテンツの配置に関するポリシーを指定

〇JavadocContentLocationOptionには以下の値が設定可能

説明
FIRST_LINE Javadocのコンテンツが/**と同じ行から始まる場合のポリシー
SECOND_LINE Javadocのコンテンツが/**の次の行から始まる場合のポリシー

チェック設定例

プロパティ設定なし

<module name="JavadocContentLocationCheck"/>

プロパティ設定あり

<module name="JavadocContentLocationCheck">
    <property name="location" value="first_line"/>
</module>

チェック実行例

プロパティ設定なし

/** 最初の行からコメントを
  * 書いているのでNG
  */
/**
  * 2行目からコメントを書いているのでOK
  */
/** 1行コメントは対象外 */

プロパティ設定あり

/** 最初の行からコメントを
   * 書いているのでOK
   */
/**
  * 2行目からコメントを書いているのでNG
  */
/** 1行コメントは対象外 */

JavadocMethod

メソッドまたはコンストラクタの Javadoc をチェックする。

プロパティ

プロパティ デフォルト値 説明
allowedAnnotations String[] Override ドキュメントの欠落を許容するアノテーションを指定する
validateThrows boolean false throwsタグの検証を行うかどうか
accessModifiers AccessModifierOption[] public, protected, package, private Javadocコメントがチェックされるアクセス修飾子を指定
allowMissingParamTags boolean false メソッドにパラメータがあるにもかかわらず、Javadoc に一致する param タグがない場合に違反を無視するかどうか
allowMissingReturnTag boolean false メソッドが非void型を返し、Javadoc に return タグがない場合、違反を無視するかどうか
tokens トークンの サブセット METHOD_DEF, CTOR_DEF, ANNOTATION_FIELD_DEF, COMPACT_CTOR_DEF チェック対象のトーク

〇AccessModifierOptionには以下の値が設定可能

  • public
  • protected
  • package
  • private

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

説明
ANNOTATION_FIELD_DEF アノテーションフィールド宣言
COMPACT_CTOR_DEF 引数なしコンストラクタ宣言
CTOR_DEF コンストラクタ宣言
METHOD_DEF メソッド宣言

チェック設定例

プロパティ設定なし

<module name="JavadocMethod"/>

プロパティ設定あり

<module name="JavadocMethod">
    <property name="accessModifiers" value="public"/>
    <property name="allowMissingParamTags" value="true"/>
</module>

チェック実行例

プロパティ設定なし

/**
 * 引数があるがJavadocに記載がないためNG
 * 
 * @throws IOException if some problem
 */
public void doSomething8(File file) throws IOException {
    if (file == null) {
        throw new IOException();
    }
}

プロパティ設定あり

/**
 * 引数についてJavadocに記載がないが「allowMissingParamTags=true」なのでOK
 * 
 * @throws IOException if some problem
 */
public void doSomething8(File file) throws IOException {
    if (file == null) {
        throw new IOException();
    }
}

JavadocMissingLeadingAsterisk

Javadocが各行の先頭にアスタリスクを持つかどうかをチェックする。

プロパティ

プロパティ デフォルト値 説明
violateExecutionOnNonTightHtml boolean false JavadocTight-HTMLルールに違反している場合、違反を表示するタイミングを制御するかどうか

チェック設定例

プロパティ設定なし

<module name="JavadocMissingLeadingAsterisk"/>

プロパティ設定あり

<module name="JavadocMissingLeadingAsterisk">
    <property name="violateExecutionOnNonTightHtml" value="true"/>
</module>

チェック実行例

// NG 行頭にアスタリスクがない
/** あいう
    えお */ 
class MyClass {}

JavadocMissingWhitespaceAfterAsterisk

先頭のアスタリスクの後に少なくとも1つの空白があるかどうかをチェックする。

プロパティ

プロパティ デフォルト値 説明
violateExecutionOnNonTightHtml boolean false JavadocTight-HTMLルールに違反している場合、違反を表示するタイミングを制御するかどうか

チェック設定例

プロパティ設定なし

<module name="JavadocMissingWhitespaceAfterAsterisk"/>

プロパティ設定あり

<module name="JavadocMissingWhitespaceAfterAsterisk">
    <property name="violateExecutionOnNonTightHtml" value="true"/>
</module>

チェック実行例

// NG アスタリスクの後ろに空白がない
/**
*コメント
*/
int invalidJavaDoc;

JavadocPackage

Javaパッケージがコメント用に使用されるJavadocファイルを持っているかどうかをチェックする。
デフォルトでは、package-info.java ファイルのみを許可するが、 package.html ファイルを許可するように設定することも可能。
両方のファイルが存在する場合、Javadocツールで許可されていないため、違反となる。

プロパティ

プロパティ デフォルト値 説明
allowLegacy boolean false package.htmlファイルを使用できるようにするかどうか
fileExtensions String[] .java 処理するファイルのファイルタイプ拡張子を指定する

チェック設定例

プロパティ設定なし

<module name="JavadocPackage"/>

プロパティ設定あり

<module name="JavadocPackage">
    <property name="allowLegacy" value="true"/>
</module>

チェック実行例

プロパティ設定なし

package-info.javaがない場合NG

プロパティ設定あり

package.htmlがない場合NG


JavadocParagraph

Javadocの段落をチェックする。
以下のチェックが行われる。

  • 2つの段落の間にそれぞれ1行の空白行がある
  • 最初の段落以外の各段落は、最初の単語の直前に<p>があり、その後に空白がない

プロパティ

プロパティ デフォルト値 説明
violateExecutionOnNonTightHtml boolean false JavadocTight-HTMLルールに違反している場合、違反を表示するタイミングを制御するかどうか
allowNewlineParagraph boolean true <p>タグを最初の単語の直前に置くかどうか

チェック設定例

プロパティ設定なし

<module name="JavadocParagraph"/>

プロパティ設定あり

<module name="JavadocParagraph">
    <property name="allowNewlineParagraph" value="false"/>
</module>

チェック実行例

プロパティ設定なし

/**
 * コメント!
 *
 * <p>pタグの後ろにすぐコメントを記述する
 * <p>pタグの前には1行の空行が必要(NG)
 *
 * <p>
 * pタグの後で改行しない(NG)
 *
 * <p> pタグの後ろにスペースを挿入しない(NG)
 *
 */
public class MyClass {
}

プロパティ設定あり

/**
 * コメント!
 *
 * <p>pタグの後ろにすぐコメントを記述する
 * <p>pタグの前には1行の空行が必要(NG)
 *
 * <p>
 * pタグの後で改行してもよい
 *
 * <p> pタグの後ろにスペースを挿入してもよい
 *
 */
public class MyClass {
}

JavadocStyle

Javadocコメントが適切に形成されていることを確認するために、コメントをチェックする。
以下のチェックを行う。

  • 最初の文が適切な句読点で終わるようにする(デフォルトでは「.」、「?」、「!」)
  • 説明のないJavadocステートメントのテキストをチェックする 空のJavadoc、@paramや@returnのようなタグだけを持つJavadocの両方が含まれる
  • テキストに不完全なHTMLタグがないかどうかをチェックする HTMLタグに対応する終了タグがあるかどうかを確認し、ない場合は「Unclosed HTML tag found:」エラーを発行する 終了タグが前の開始タグなしで見つかった場合、「Extra HTML tag found: 」エラーを発行する
  • パッケージのJavadocコメントが整形式であり、package-info.javaファイルが存在することをチェックする
  • 許可されたHTMLタグであるかどうかをチェックする

プロパティ

プロパティ デフォルト値 説明
scope Scope private Javadocコメントをチェックする可視性スコープを指定
excludeScope Scope null Javadocコメントをチェックしない可視性スコープを指定
checkFirstSentence boolean true 最初の文の文末が適切かどうかをチェックするかどうか
endOfSentenceFormat Pattern `"([.?!][ \t\n\r\f<]) ([.?!]$)"`|文末のマッチング形式を指定
checkEmptyJavadoc boolean false Javadocが空かどうかをチェックするかどうか
checkHtml boolean true 不完全なHTMLタグをチェックするかどうか
tokens トークンの サブセット ANNOTATION_DEF, ANNOTATION_FIELD_DEF, CLASS_DEF, CTOR_DEF, ENUM_CONSTANT_DEF, ENUM_DEF, INTERFACE_DEF, METHOD_DEF, PACKAGE_DEF, VARIABLE_DEF, RECORD_DEF, COMPACT_CTOR_DEF チェック対象のトーク

〇 Scopeには以下の値が設定可能 public を指定すると、public な修飾子を持つ項目のみがチェックされる。 protected を指定すると、public および protected 修飾子のみをチェックする。

  • nothing
  • public
  • protected
  • package
  • private
  • anoninner

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

説明
ANNOTATION_DEF アノテーション宣言
ANNOTATION_FIELD_DEF アノテーションフィールド宣言
CLASS_DEF クラス宣言
COMPACT_CTOR_DEF 引数なしコンストラクタ宣言
CTOR_DEF コンストラクタ宣言
ENUM_CONSTANT_DEF Enum定数宣言
ENUM_DEF Enum宣言
INTERFACE_DEF インターフェース宣言
METHOD_DEF メソッド宣言
PACKAGE_DEF パッケージ宣言
RECORD_DEF レコード宣言
VARIABLE_DEF フィールド・ローカル変数宣言

チェック設定例

プロパティ設定なし

<module name="JavadocStyle"/>

プロパティ設定あり

<module name="JavadocStyle">
    <property name="scope" value="public"/>
</module>

チェック実行例

プロパティ設定なし

public class MyClass {
    // OK
    /**
     * Some description here.
     */
    private void methodWithValidCommentStyle() {}

    // NG 文末にピリオド、クエスチョンマーク、エクスクラメーションマークのいずれも存在しない
    /**
     * Some description here
     */
    private void methodWithInvalidCommentStyle() {}
}

プロパティ設定あり

public class MyClass {
    // NG 文末にピリオド、クエスチョンマーク、エクスクラメーションマークのいずれも存在しない
    /**
     * Some description here
     */
    public void test1() {}

    // OK privateメソッドはチェック対象外
    /**
     * Some description here
     */
    private void test2() {}
}

JavadocTagContinuationIndentation

ブロックタグの継続行のインデントをチェックする。 継続行とは、タグのある行を越えて記述が続くことを指す。 デフォルトのインデントは最低4だが、プロパティで変更することが可能。

プロパティ

プロパティ デフォルト値 説明
violateExecutionOnNonTightHtml boolean false JavadocTight-HTMLルールに違反している場合、違反を表示するタイミングを制御するかどうか
offset int 4 新しいインデントレベルに使用するスペース数

チェック設定例

プロパティ設定なし

<module name="JavadocTagContinuationIndentation"/>

プロパティ設定あり

<module name="JavadocTagContinuationIndentation">
    <property name="offset" value="2"/>
</module>

チェック実行例

プロパティ設定なし

/**
 * @tag comment
 *  Indentation spacing is 1. (NG)
 *   Indentation spacing is 2. (NG)
 *     Indentation spacing is 4.
 */
public class MyClass {
}

プロパティ設定あり

/**
 * @tag comment
 * Indentation spacing is 0. (NG)
 *   Indentation spacing is 2.
 *  Indentation spacing is 1. (NG)
 */
public class MyClass {
}

JavadocType

型定義のJavadocコメントをチェックする。
デフォルトでは、作者やバージョンのタグはチェックしない。
検証するスコープはScopeクラスを使用して指定し、デフォルトはScope.PRIVATE

プロパティ

プロパティ デフォルト値 説明
scope Scope private Javadocコメントをチェックする可視性スコープを指定
excludeScope Scope null Javadocコメントをチェックしない可視性スコープを指定
authorFormat Pattern null @authorタグのパターンを指定
versionFormat Pattern null @versionタグのパターンを指定
allowMissingParamTags boolean false クラスが型パラメータを持つが、Javadoc に一致する param タグがない場合に、違反を無視するかどうか
allowUnknownTags boolean false Javadocタグが認識されない場合の違反を無視するかどうか
allowedAnnotations String[] Generated ドキュメントがなくても許容するアノテーションを指定する
tokens トークンの サブセット INTERFACE_DEF, CLASS_DEF, ENUM_DEF, ANNOTATION_DEF, RECORD_DEF チェック対象のトーク

〇Scopeには以下の値が設定可能
public を指定すると、public な修飾子を持つ項目のみがチェックされる。 protected を指定すると、public および protected 修飾子のみをチェックする。

  • nothing
  • public
  • protected
  • package
  • private
  • anoninner

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

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

チェック設定例

プロパティ設定なし

<module name="JavadocType"/>

プロパティ設定あり

<module name="JavadocType">
    <property name="allowedAnnotations" value="SpringBootApplication,Configuration"/>
</module>

チェック実行例

プロパティ設定なし

// NG Javadocコメントがない
@SpringBootApplication
public class Application {}

// NG Javadocコメントがない
@Configuration
class DatabaseConfiguration {}

プロパティ設定あり

// OK
@SpringBootApplication
public class Application {}

// OK
@Configuration
class DatabaseConfiguration {}

JavadocVariable

変数が Javadoc コメントを持つかどうかをチェックする。
serialVersionUIDフィールドは無視される。

プロパティ

プロパティ デフォルト値 説明
scope Scope private Javadocコメントをチェックする可視性スコープを指定
excludeScope Scope null Javadocコメントをチェックしない可視性スコープを指定
ignoreNamePattern Pattern null 無視する変数名を定義する正規表現
tokens トークンの サブセット ENUM_CONSTANT_DEF チェック対象のトーク

〇Scopeには以下の値が設定可能
public を指定すると、public な修飾子を持つ項目のみがチェックされる。 protected を指定すると、public および protected 修飾子のみをチェックする。

  • nothing
  • public
  • protected
  • package
  • private
  • anoninner

チェック設定例

プロパティ設定なし

<module name="JavadocVariable"/>

プロパティ設定あり

<module name="JavadocVariable">
    <property name="scope" value="public"/>
</module>

チェック実行例

プロパティ設定なし

public class Test {
    // NG Javadocコメントがない
    private int a;

    // OK
    /**
     * Some description here
     */
    private int b;
    
    // NG Javadocコメントがない
    protected int c;
    
    // NG Javadocコメントがない
    public int d;
}

プロパティ設定あり

public class Test {
    // OK privateメソッドはチェック対象外
    private int a;

    // OK
    /**
     * Some description here
     */
    private int b;
    
    // OK protectedメソッドはチェック対象外
    protected int c;
    
    // NG Javadocコメントがない
    public int d;
}

MissingJavadocMethod

メソッドまたはコンストラクタのJavadocコメントが欠落していないかどうかをチェックする。
検証するスコープはScopeクラスを使用して指定し、デフォルトは Scope.PUBLIC

プロパティ

プロパティ デフォルト値 説明
minLineCount int -1 Javadocの欠落を許可するメソッドの最小行数
allowedAnnotations String[] Override Javadocの欠落を許可するアノテーション
scope Scope public Javadocコメントをチェックする可視性スコープを指定
excludeScope Scope null Javadocコメントをチェックしない可視性スコープを指定
allowMissingPropertyJavadoc boolean false プロパティ(セッターとゲッター)のアクセサー・メソッドにJavadocがないことを許可するかどうか
ignoreMethodNamesRegex Pattern null チェック対象外とするメソッド名の正規表現
tokens トークンの サブセット METHOD_DEF, CTOR_DEF, ANNOTATION_FIELD_DEF, COMPACT_CTOR_DEF チェック対象のトーク

〇 Scopeには以下の値が設定可能
public を指定すると、public な修飾子を持つ項目のみがチェックされる。 protected を指定すると、public および protected 修飾子のみをチェックする。

  • nothing
  • public
  • protected
  • package
  • private
  • anoninner

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

説明
METHOD_DEF メソッド宣言
CTOR_DEF コンストラクタ宣言
ANNOTATION_FIELD_DEF アノテーションフィールド宣言
COMPACT_CTOR_DEF 引数なしコンストラクタ宣言

チェック設定例

プロパティ設定なし

<module name="MissingJavadocMethod"/>

プロパティ設定あり

<module name="MissingJavadocMethod">
    <property name="scope" value="private"/>
</module>

チェック実行例

プロパティ設定なし

public class MyClass {
    // NG Javadocコメントがない
    public MyClass() {}
    
    // NG Javadocコメントがない
    public void foo() {}
    
    // OK
    /**
     * Some description here.
     */
    public void foo2() {}

    // OK @overrideアノテーションが付与されているのでチェック対象外
    @Override
    public String toString() {
        return "Some string";
    }

    // OK privateメソッドはチェック対象外
    private void foo3() {}
    
    // OK protectedメソッドはチェック対象外
    protected void foo4() {}
    
    // OK package-privateメソッドはチェック対象外
    void foo5() {}
}

プロパティ設定あり

public class MyClass {
    // NG Javadocコメントがない
    private void foo() {}
}

MissingJavadocPackage

package-info.javaファイルにJavadocコメントがないかどうかをチェックする。

プロパティ

なし

チェック設定例

<module name="MissingJavadocPackage"/>

チェック実行例

// OK
/**
* Provides API classes
*/
package com.checkstyle.api;

// NG Javadocコメントがない
/*
* Block comment is not a javadoc
*/
package com.checkstyle.api;

MissingJavadocType

クラス、enum、インターフェース、およびアノテーション・インターフェース定義のJavadocコメントが欠落していないかどうかをチェックする。
検証するスコープはScopeクラスを使用して指定し、デフォルトは Scope.PUBLIC。

プロパティ

プロパティ デフォルト値 説明
scope Scope public Javadocコメントをチェックする可視性スコープを指定
excludeScope Scope null Javadocコメントをチェックしない可視性スコープを指定
skipAnnotations String[] Generated ドキュメントの欠落を許可するアノテーション
tokens トークンの サブセット INTERFACE_DEF, CLASS_DEF, ENUM_DEF, ANNOTATION_DEF, RECORD_DEF チェック対象のトーク

〇 Scopeには以下の値が設定可能
public を指定すると、public な修飾子を持つ項目のみがチェックされる。 protected を指定すると、public および protected 修飾子のみをチェックする。

  • nothing
  • public
  • protected
  • package
  • private
  • anoninner

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

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

チェック設定例

プロパティ設定なし

<module name="MissingJavadocType"/>

プロパティ設定あり

<module name="MissingJavadocType">
    <property name="scope" value="private"/>
</module>

チェック実行例

プロパティ設定なし

// NG Javadocコメントがない
public class PublicClass {
}

// OK privateクラスはチェック対象外
private class PrivateClass {
}
// OK protectedクラスはチェック対象外
protected class ProtectedClass {
}
// OK package-privateクラスはチェック対象外
class PackagePrivateClass {
}

プロパティ設定あり

// NG Javadocコメントがない
public class PublicClass {
}

// NG Javadocコメントがない
private class PrivateClass {
}
// NG Javadocコメントがない
protected class ProtectedClass {
}
// NG Javadocコメントがない
class PackagePrivateClass {
}

NonEmptyAtclauseDescription

ブロックタグの後に記述があるかどうかをチェックする。

プロパティ

プロパティ デフォルト値 説明
violateExecutionOnNonTightHtml boolean false JavadocTight-HTMLルールに違反している場合、違反を表示するタイミングを制御するかどうか
javadocTokens Javadocトークンの サブセット PARAM_LITERAL, RETURN_LITERAL, THROWS_LITERAL, EXCEPTION_LITERAL, DEPRECATED_LITERAL チェック対象のJavadocトーク

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

説明
PARAM_LITERAL param
RETURN_LITERAL return
THROWS_LITERAL throws
EXCEPTION_LITERAL exception
DEPRECATED_LITERAL deprecated

チェック設定例

プロパティ設定なし

<module name="NonEmptyAtclauseDescription"/>

プロパティ設定あり

<module name="NonEmptyAtclauseDescription">
    <property name="javadocTokens" value="PARAM_LITERAL,RETURN_LITERAL"/>
</module>

チェック実行例

プロパティ設定なし

/**
* コメント
*
* @param a Some javadoc
* @param b // NG 説明がない
* @deprecated // NG 説明がない
* @throws Exception // NG 説明がない
*/
public int method(String a, int b) throws Exception {
    return 1;
}

プロパティ設定あり

/**
* コメント
*
* @param a Some javadoc
* @param b // NG 説明がない
* @deprecated
* @throws Exception
*/
public int method(String a, int b) throws Exception {
    return 1;
}

RequireEmptyLineBeforeBlockTagGroup

Javadocにブロックタグがある場合、その前に1行の空行があるかどうかをチェックする。

プロパティ

プロパティ デフォルト値 説明
violateExecutionOnNonTightHtml boolean false JavadocTight-HTMLルールに違反している場合、違反を表示するタイミングを制御するかどうか

チェック設定例

プロパティ設定なし

<module name="RequireEmptyLineBeforeBlockTagGroup"/>

プロパティ設定あり

<module name="RequireEmptyLineBeforeBlockTagGroup">
    <property name="violateExecutionOnNonTightHtml" value="true"/>
</module>

チェック実行例

/**
 * コメント
 * @return something (NG:1行空行が必要)
 */
public boolean foo() {
    return false;
}

SingleLineJavadoc

Javadocブロックが1行に収まるかどうか、ブロックタグを含まないかどうかをチェックする。
少なくとも1つのブロックタグを含むJavadocコメントは、数行でフォーマットされる必要がある。

プロパティ

プロパティ デフォルト値 説明
violateExecutionOnNonTightHtml boolean false JavadocTight-HTMLルールに違反している場合、違反を表示するタイミングを制御するかどうか
ignoredTags String[] {} チェック対象外とするブロックタグを指定
ignoreInlineTags boolean true インラインタグを無視するかどうか

チェック設定例

プロパティ設定なし

<module name="SingleLineJavadoc"/>

プロパティ設定あり

<module name="SingleLineJavadoc">
    <property name="ignoredTags" value="@inheritDoc, @see"/>
    <property name="ignoreInlineTags" value="false"/>
</module>

チェック実行例

プロパティ設定なし

// NG ブロックタグを含む場合、Javadocは複数行である必要がある
/** @see Math */
public int foo() {
  return 42;
}

// OK
/**
 * @return 42
 */
public int bar() {
  return 42;
}

// OK
/** {@link #equals(Object)} */
public int baz() {
  return 42;
}

プロパティ設定あり

// OK
/** @see Math */
public int foo() {
  return 42;
}

// OK
/**
 * @return 42
 */
public int bar() {
  return 42;
}

// NG Javadocは複数行である必要がある
/** {@link #equals(Object)} */
public int baz() {
  return 42;
}

SummaryJavadoc

Javadocの要約文に、使用を推奨しない語句が含まれていないかチェックする。
{@inheritDoc}タグのみを含む場合、チェックはスキップされ、空でない{@code {@return}}を含む@Summaryは許容される。
最初の文が含まれていないJavadocはチェックNGとなる。

プロパティ

プロパティ デフォルト値 説明
violateExecutionOnNonTightHtml boolean false JavadocTight-HTMLルールに違反している場合、違反を表示するタイミングを制御するかどうか
forbiddenSummaryFragments Pattern "^$" 禁止されたsummaryの文言の正規表現を指定
period String "." Javadocの最初の文の末尾のピリオド記号を指定

チェック設定例

プロパティ設定なし

<module name="SummaryJavadocCheck"/>

プロパティ設定あり

<module name="SummaryJavadocCheck">
    <property name="period" value="。"/>
</module>

チェック実行例

プロパティ設定なし

// NG
/**
 * {@summary  }
 */
public String foo(){
    return "";
}

// OK
/**
 * {@summary <p>This is summary for bar.<p/>}
 */
public void bar(){}

プロパティ設定あり

// NG
/**
 * Comment!
 */
public void bar(){}

// OK
/**
 * Comment。
 */
public void bar(){}

WriteTag

ユーザー定義のJavadocタグが、定義されたフォーマットで Javadoc コメントに存在することをチェックする。

プロパティ

プロパティ デフォルト値 説明
tag String null タグの名称を指定
tagFormat Pattern null タグの内容にマッチする正規表現を指定
tagSeverity SeverityLevel info タグが検出され、出力されたときの重要度を指定
tokens トークンの サブセット INTERFACE_DEF, CLASS_DEF, ENUM_DEF, ANNOTATION_DEF, RECORD_DEF チェック対象のトーク

〇SeverityLevelには以下の値が設定可能

  • ignore
  • info
  • warning
  • error

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

説明
INTERFACE_DEF インターフェース宣言
CLASS_DEF クラス宣言
ENUM_DEF Enum宣言
ENUM_CONSTANT_DEF Enum定数宣言
ANNOTATION_DEF アノテーション宣言
RECORD_DEF レコード宣言
METHOD_DEF メソッド宣言
CTOR_DEF コンストラクタ宣言
ANNOTATION_FIELD_DEF アノテーションフィールド宣言
COMPACT_CTOR_DEF 引数なしコンストラクタ宣言

チェック設定例

プロパティ設定なし

<module name="WriteTag"/>

プロパティ設定あり

<module name="WriteTag">
    <property name="tag" value="@since"/>
</module>

チェック実行例

プロパティ設定なし

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

プロパティ設定あり

// NG クラスのJavadocコメントに@sinceタグが必要
/**
* Some class
*/
public class Test {
  /** some doc */
  void foo() {}
}

Checkstyle チェック項目ーImports

Checkstyleチェック項目:Imports

CheckStyle公式ドキュメント

ver 10.3.1

AvoidStarImport

*を使用するimport文がないことをチェックする。

プロパティ

プロパティ デフォルト値 説明
excludes String[] {} *を使用するインポートが許可されるパッケージと、 *を使用するstaticインポートが許可されるクラスを指定
allowClassImports boolean false import java.util.*; のような*を使用するインポートを許可するかどうか
allowStaticMemberImports boolean false import static org.junit.Assert.*; のように、*を使用するstaticインポートを許可するかどうか

チェック設定例

プロパティ設定なし

<module name="AvoidStarImport"/>

プロパティ設定あり

<module name="AvoidStarImport">
    <property name="excludes" value="java.io,java.net"/>
    <property name="allowStaticMemberImports" value="true"/>
</module>

チェック実行例

プロパティ設定なし

// OK
import java.util.Scanner;
// NG *を使用しない
import java.io.*;
// NG *を使用しない
import static java.lang.Math.*;
// NG *を使用しない
import java.util.*;
// NG *を使用しない
import java.net.*;

プロパティ設定あり

// OK
import java.util.Scanner;
// OK 「excludes」に含まれているので*でもOK
import java.io.*;
// OK 「allowStaticMemberImports=true」なので*でもOK
import static java.lang.Math.*;
// NG *を使用しない
import java.util.*;
// OK 「excludes」に含まれているので*でもOK
import java.net.*;

AvoidStaticImport

static importがないことをチェックする。

プロパティ

プロパティ デフォルト値 説明
excludes String[] {} staticインポートが許可されるクラスを指定

チェック設定例

プロパティ設定なし

<module name="AvoidStaticImport"/>

プロパティ設定あり

<module name="AvoidStaticImport">
    <property name="excludes" value="java.lang.System.out,java.lang.Math.*"/>
</module>

チェック実行例

プロパティ設定なし

// NG staticインポートを使用しない
import static java.lang.Math.pow;
// NG staticインポートを使用しない
import static java.lang.System.*;
// OK
import java.io.File;
// OK
import java.util.*; 

プロパティ設定あり

// OK 「excludes」に含まれているのでOK
import static java.lang.Math.*;
// OK 「excludes」に含まれているのでOK
import static java.lang.System.out;
// NG staticインポートを使用しない
import static java.lang.Integer.parseInt;
// OK
import java.io.*;
// OK
import java.util.*; 

CustomImportOrder

インポート宣言のグループが、ユーザーによって指定された順序で表示されるかどうかをチェックする。

順序を構成するためのグループには以下の5つがある。

  1. STATICグループ
    staticインポート
  2. SAME_PACKAGE(n)グループ
    パッケージ名とインポート名の最初のドメインがn個同じであれば、インポートはSAME_PACKAGE(n)グループであるとみなされる
    以下はSAME_PACKAGE(3) の例である
package java.util.concurrent.locks;

import java.util.concurrent.*;
import java.util.concurrent.AbstractExecutorService;
import java.util.concurrent.locks.LockSupport;
  1. THIRD_PARTY_PACKAGEグループ
    サードパーティインポート。STATIC, SAME_PACKAGE(n), STANDARD_JAVA_PACKAGE, SPECIAL_IMPORTSを除くすべてのインポートのことである
  2. STANDARD_JAVA_PACKAGEグループ 標準的な java/javax のインポート
  3. SPECIAL_IMPORTSグループ ユーザにとって特別な意味を持つインポートが含まれている場合がある

1つのインポート文が複数のグループに属する場合は、グループには以下の優先順位があるため、優先順位が高い方のグループに所属する。

  1. STATIC
  2. SAME_PACKAGE
  3. STANDARD_JAVA_PACKAGE, SPECIAL_IMPORTS
  4. THIRD_PARTY

プロパティ

プロパティ デフォルト値 説明
customImportOrderRules String "" 順番のフォーマットを指定
standardPackageRegExp Pattern "^(java|javax)." STANDARD_JAVA_PACKAGEグループに含めるクラスの正規表現
thirdPartyPackageRegExp Pattern ".*" THIRD_PARTY_PACKAGEグループに含めるクラスの正規表現
specialImportsRegExp Pattern "^$" SPECIAL_IMPORTSグループに含めるクラスの正規表現
separateLineBetweenGroups boolean true インポートグループの間に空白行を挿入するかどうか
sortImportsInGroupAlphabetically boolean false アルファベット順にするかどうか

チェック設定例

プロパティ設定なし

<module name="CustomImportOrder"/>

プロパティ設定あり

<module name="CustomImportOrder">
  <property name="customImportOrderRules" value="STATIC###STANDARD_JAVA_PACKAGE###THIRD_PARTY_PACKAGE"/>
</module>

チェック実行例

プロパティ設定なし

// OK デフォルトは順序の指定なし
package com.company;
import org.apache.commons.io.FileUtils;
import static java.util.*;
import java.time.*;
import static java.io.*;
import com.puppycrawl.tools.checkstyle.checks.imports.CustomImportOrderCheck;
import com.puppycrawl.tools.checkstyle.checks.imports.ImportOrderCheck;

プロパティ設定あり

package com.company;

import static java.util.*;

import java.time.*;
import javax.net.*;
// NG static importは一番上にあるべき
import static java.io.*;

import org.apache.commons.io.FileUtils;
import com.puppycrawl.tools.checkstyle.checks.imports.CustomImportOrderCheck;
import com.puppycrawl.tools.checkstyle.checks.imports.ImportOrderCheck;

IllegalImport

不正なパッケージセットからのインポートがないかチェックする。
デフォルトでは、sun.* パッケージを拒否するチェックが行われる。

プロパティ

プロパティ デフォルト値 説明
illegalPkgs String[] sun 不正とするパッケージ。 regexpプロパティがfalseの場合、 importがパッケージの一部であるかどうかをチェックし、 trueの場合は正規表現として解釈される
illegalClasses String[] {} 不正とするクラス名。 regexpプロパティがfalseの場合、 インポートがクラス名と等しいかどうかをチェックし、 trueの場合は正規表現として解釈される
regexp boolean false illegalPkgs と illegalClasses を正規表現として解釈するかどうか

チェック設定例

プロパティ設定なし

<module name="IllegalImport"/>

プロパティ設定あり

<module name="IllegalImport">
    <property name="illegalPkgs" value="java.io, java.sql"/>
</module>

チェック実行例

プロパティ設定なし

import java.io.*;
import java.lang.ArithmeticException;
import java.sql.Connection;
import java.util.List;
import java.util.Enumeration;
import java.util.Arrays;
// NG
import sun.applet.*;

public class InputIllegalImport { }

プロパティ設定あり

// NG
import java.io.*;
import java.lang.ArithmeticException;
// NG
import java.sql.Connection;
import java.util.List;
import java.util.Enumeration;
import java.util.Arrays;
import sun.applet.*;

public class InputIllegalImport { }

ImportControl

各パッケージやファイルでインポート可能なものを制御する。

プロパティ

プロパティ デフォルト値 説明
file URI null インポート制御の設定ファイルの場所。 まずURLとして、次にファイルとして、そして最後にリソースとしてパスを読み込もうとする。
path Pattern ".*" このチェックを適用するファイルパスの正規表現。 パターンにマッチしないパスに存在するファイルはチェックされない。

チェック設定例

プロパティ設定なし

プロパティを設定しない場合はインポートの制御は行われない。

プロパティ設定あり

<module name="ImportControl">
    <property name="file" value="config/import-control.xml"/>
    <property name="path" value="^.*[\\/]src[\\/]main[\\/].*$"/>
</module>

インポート制御の設定ファイル(import-control.xml)の記述例は以下の通り。

以下の記述では、com.puppycrawl.tools.checkstyle.checks.imports パッケージ内で java.util.stream.Stream と java.util.stream.Collectors のインポートは許可されていない。
一方で、<allow pkg="java.util.stream"/> によって java.util.stream からの全てのインポートはdisallowに記述されているものを除いて許可されている。

<import-control pkg="com.puppycrawl.tools.checkstyle.checks">
    <allow pkg="java.util.stream"/>
    <subpackage name="imports">
        <disallow class="java.util.stream.Stream"/>
        <disallow class="java.util.stream.Collectors"/>
    </subpackage>
</import-control>

チェック実行例

プロパティ設定なし

プロパティを設定しない場合はインポートの制御は行われない。

プロパティ設定あり

package com.puppycrawl.tools.checkstyle.checks.imports;

// NG
import java.util.stream.Stream;
// NG
import java.util.stream.Collectors;
import java.util.stream.IntStream;

ImportOrder

インポートの順番やグループ分けをチェックする。

チェック内容には以下のものがある。

  • インポートグループが特定の順序になっていること
  • 各グループの間に空白行があること
  • 各グループが空白行やコメントで内部的に分離されていないこと
  • 各グループ内のインポートが辞書順であること
  • インポート間の比較が大文字と小文字を区別されていること
  • 型インポートとstaticインポートの相対的な順序を保証すること

プロパティ

プロパティ デフォルト値 説明
option ImportOrderOption under 型のインポートとstaticインポートの 相対的な順序に関するポリシー
groups Pattern[] {} タイプインポートグループのリスト
ordered boolean true 各グループ内の型のインポートをソートするかどうか
separated boolean false 型のインポートグループを、少なくとも1行の空白行またはコメントで区切り、 内部で区切らないようにするかどうか
separatedStaticGroups boolean false staticインポートグループを、少なくとも1行の空白行またはコメントで区切り、内部で区切らないようにするかどうか プロパティ option が top または bottom に設定され、プロパティ staticGroups が有効な場合にのみ有効
caseSensitive boolean true 文字列比較を大文字小文字を区別して行うかどうか
staticGroups Pattern[] {} staticインポートグループのリスト propertyオプションがtopまたはbottomに設定されている場合にのみ有効
sortStaticImportsAlphabetically boolean false グループ内で上下に配置されたstaticインポートをソートするかどうか
useContainerOrderingForStatic boolean false staticインポートにコンテナ順序(Eclipse IDE用語)を使用するかどうか
tokens トークンの サブセット STATIC_IMPORT チェック対象の トーク

〇ImportOrderOptionには以下の値が設定可能

説明
top すべてのstaticインポートが一番上に配置される
above staticインポートは同一クラスのローカルインポートより上に配置する
inflow すべてのstaticインポートは、staticインポートでないものと同様に処理する
under staticインポートは同一クラスのローカルインポートより下に配置する
bottom すべてのstaticインポートが一番下に配置される

チェック設定例

プロパティ設定なし

<module name="ImportOrder"/>

プロパティ設定あり

<module name="ImportOrder">
    <property name="groups" value="/^java\./,javax,org"/>
    <property name="ordered" value="true"/>
    <property name="separated" value="true"/>
    <property name="option" value="above"/>
    <property name="sortStaticImportsAlphabetically" value="true"/>
</module>

チェック実行例

プロパティ設定なし

import java.io.IOException;
import java.net.URL;

// NG 余計な分離がある
import java.io.IOException;
import javax.net.ssl.TrustManager;
import javax.swing.JComponent;
import org.apache.http.conn.ClientConnectionManager;
// NG 'java' は 'org' より前に記述する
import java.util.Set;
// NG 'com'は一番上に記述するべき
import com.neurologic.http.HttpClient;
import com.neurologic.http.impl.ApacheHttpClient;

プロパティ設定あり

import static java.lang.System.out;
// NG 辞書順となっていない
import static java.lang.Math;
import java.io.IOException;

// NG 余計な分離がある
import java.net.URL;
import java.security.KeyManagementException;

import javax.net.ssl.TrustManager;

// NG グループ内で空白行が存在している
import javax.net.ssl.X509TrustManager;

import org.apache.http.conn.ClientConnectionManager;

RedundantImport

冗長なimport文があるかどうかをチェックする。
以下の場合、import文は冗長とみなされる。

  • 他のインポートと重複している。 あるクラスが2回以上インポートされている場合など
  • インポートクラスが java.lang パッケージからである場合 java.lang.String のインポートなど
  • インポートクラスが現在のパッケージと同じパッケージのものである場合

プロパティ

なし

チェック設定例

<module name="RedundantImport"/>

チェック実行例

package Test;

import static Test.MyClass.*;
import static java.lang.Integer.MAX_VALUE;

// NG
import Test.MyClass;
// NG
import java.lang.String;
import java.util.Scanner;
// NG
import java.util.Scanner;

public class MyClass{ };

UnusedImports

未使用の import 文をチェックする。
import 文は、以下の場合に未使用とみなされる。

  • ファイル内で参照されることはない場合
  • 他のインポートと重複している場合
  • java.langパッケージのインポート
  • 同じパッケージからのインポート
  • Javadocコメントで参照されている import java.util.List は、Javadoc コメント {@link List} で参照されているとみなされる

プロパティ

プロパティ デフォルト値 説明
processJavadoc boolean true Javadocコメントを処理するかどうか

チェック設定例

プロパティ設定なし

<module name="UnusedImports"/>

プロパティ設定あり

<module name="UnusedImports">
    <property name="processJavadoc" value="false"/>
</module>

チェック実行例

プロパティ設定なし

package Test;

// NG
import java.lang.String;
// NG
import java.util.List;


public class MyClass{
    
    /**
    * {@link List}
    */
    public void foo(){
        String s = "aaa";
    }
};

プロパティ設定あり

package Test;

// NG
import java.lang.String;
// OK
import java.util.List;


public class MyClass{
    
    /**
    * {@link List}
    */
    public void foo(){
        String s = "aaa";
    }
};

Checkstyle チェック項目ーHeaders

Checkstyleチェック項目:Headers

CheckStyle公式ドキュメント

ver 10.3.1

RegexpHeader

ソースファイルのヘッダを、ソースヘッダの各行に対応するパターンを含むヘッダと照合してチェックする。

プロパティ

プロパティ デフォルト値 説明
headerFile URI null 必要なヘッダーを含むファイル名を指定
charset String Checkerモジュールのcharsetプロパティ headerFileを読み込む際に使用する文字エンコーディングを指定
header String null インラインで指定された必要なヘッダーを指定します。個々のヘッダー行は、文字列 "∕n" で区切る必要がある。
multiLines int[] {} 繰り返す行番号を指定する(0回以上)
fileExtensions String[] all files 処理するファイルのファイルタイプ拡張子を指定

チェック設定例

プロパティ設定なし

<module name="RegexpHeader"/>

プロパティ設定あり

<module name="RegexpHeader">
  <property name="header" value="^// Copyright \(C\) (\d\d\d\d -)? 2004 MyCompany$ \n^// All rights reserved$"/>
</module>

チェック実行例

プロパティ設定なし

プロパティ未設定の場合はチェックされない

プロパティ設定あり

^// Copyright \(C\) (\d\d\d\d -)? 2004 MyCompany$
^// All rights reserved$
package Test;

public class MyClass{
    
}

ソースファイルが指定されたヘッダで始まるかどうかをチェックする。

プロパティ

プロパティ デフォルト値 説明
headerFile URI null 必要なヘッダーを含むファイル名を指定
charset String Checker モジュールの charset プロパティ headerFileを読み込む際に使用する文字エンコーディングを指定
header String null インラインで指定された必要なヘッダーを指定します。個々のヘッダー行は、文字列 "∕n" で区切る必要がある。
ignoreLines int[] {} 無視する行番号を指定
fileExtensions String[] all files 処理するファイルのファイルタイプ拡張子を指定

チェック設定例

プロパティ設定なし

<module name="Header"/>

プロパティ設定あり

<module name="Header">
    <property name="header" value="// Copyright (C) 2004 MyCompany\n// All rights reserved"/>
</module>

チェック実行例

プロパティ設定なし

設定がない場合はチェックが行われない

プロパティ設定あり

// OK
// Copyright (C) 2004 MyCompany
// All rights reserved
package Test;

public class MyClass{
    
}

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++;
        }
    }
}

Checkstyle チェック項目ーClass Design

Checkstyleチェック項目:Class Design

CheckStyle公式ドキュメント

ver 10.3.1

DesignForExtension

クラスが拡張(サブクラス作成)用に設計されているかどうかをチェックする。
このチェックでは、オーバーライド可能なメソッド (非static、非final、非abstractのpublicまたはprotectedメソッド) を持ち、空でない実装を持つクラスが検出される。

プロパティ

プロパティ デフォルト値 説明
ignoredAnnotations String[] After, AfterClass, Before, BeforeClass, Test メソッドをチェックから除外するためのアノテーションを指定
requiredJavadocPhrase Pattern ".*" 拡張用に設計されたメソッドを修飾するコメント文のパターンを指定

チェック設定例

プロパティ設定なし

<module name="DesignForExtension"/>

プロパティ設定あり

<module name="DesignForExtension">
    <property name="ignoredAnnotations" value="Override, Test"/>
</module>

チェック実行例

プロパティ設定なし

public class MyClassTest {
    // OK
    @Test
    public void foo() {
        final B b = new A();
        assertEquals(2, b.foo());
    }

    // NG
    public int foo2() {return 8;}
}

プロパティ設定あり

public class MyClassTest {
    // OK ignoredAnnotationsに設定したアノテーションが付与されているのでOK
    @Test
    public void foo() {
        final B b = new A();
        assertEquals(2, b.foo());
    }

    // OK ignoredAnnotationsに設定したアノテーションが付与されているのでOK
    @Override
    public int foo2() {return 8;}
}

FinalClass

privateコンストラクタのみを持ち、子クラスを持たないクラスが final として宣言されているかどうかをチェックする。

プロパティ

なし

チェック設定例

<module name="FinalClass"/>

チェック実行例

// OK
final class MyClass {
    private MyClass() {
    }
}

// NG
class MyClass {
    private MyClass() {
    }
}

HideUtilityClassConstructor

ユーティリティクラス (APIにstaticメソッドまたはフィールドのみを含むクラス) がpublicなコンストラクタを持たないことをチェックする。

プロパティ

なし

チェック設定例

<module name="HideUtilityClassConstructor"/>

チェック実行例

// NG ユーティリティクラスにpublicなコンストラクタは持たない
class MyClass {
    public MyClass() {
    }

    public static void foo() {
    }
}

// OK
class MyClass {

    private MyClass() {
    }

    static int n;
}

// NG デフォルトコンストラクタ(public)が定義されている
class MyClass { 
    static float f;
}

InnerTypeLast

ネストされた(内部)クラス/インターフェースがプライマリ(トップレベル)クラスの下部で宣言されているかどうかをチェックする。
内部クラスは全てのイニシャライザブロック、メソッド、コンストラクタ、フィールドの宣言の後に記述する。

プロパティ

なし

チェック設定例

<module name="InnerTypeLast"/>

チェック実行例

class MyClass {
    private String s;
    
    // NG 内部クラスは一番下に配置する
    class InnerClass { 
    }
    
    public void foo() {  
    }
}

InterfaceIsType

メソッドを持たず定数のみを含むインタフェースを定義されていないかチェックする。
デフォルトではマーカーインターフェースはチェック対象外だが、プロパティでマーカーインターフェースもチェック対象とすることもできる。

プロパティ

プロパティ デフォルト値 説明
allowMarkerInterfaces boolean true マーカインタフェースを許可するかどうか

チェック設定例

プロパティ設定なし

<module name="InterfaceIsType"/>

プロパティ設定あり

<module name="InterfaceIsType">
    <property name="allowMarkerInterfaces" value="false"/>
</module>

チェック実行例

プロパティ設定なし

// NG 定数しか定義されていない
public interface Test1 {
    int a = 3;
}

// OK 「allowMarkerInterfaces=true」なのでOK
public interface Test2 {
}

// OK
public interface Test3 {
    int a = 3;
    
    void test();
}

プロパティ設定あり

// NG 定数しか定義されていない
public interface Test1 {
    int a = 3;
}

// NG 「allowMarkerInterfaces=false」なので何も定義のないインターフェースはNGとなる
public interface Test2 {
}

// OK
public interface Test3 {
    int a = 3;
    
    void test();
}

MutableException

例外のすべてのメンバがfinalであることをチェックする。

プロパティ

プロパティ デフォルト値 説明
format Pattern "^.*Exception$|^.*Error$|^.*Throwable$" チェック対象の例外クラス名のパターンを指定
extendedClassNameFormat Pattern "^.*Exception$|^.*Error$|^.*Throwable$" チェック対象のextendsクラス名のパターンを指定

チェック設定例

プロパティ設定なし

<module name="MutableException"/>

プロパティ設定あり

<module name="MutableException">
    <property name="format" value="^.*Error$\|^.*Throwable$"/>
</module>

チェック実行例

プロパティ設定なし

// NG メンバをfinalで宣言する必要がある
public class MyException extends RuntimeException {
    private int errorCode;
    
    public MyException(String message, int errorCode) {
        super(message);
        this.errorCode = errorCode;
    }
}

プロパティ設定あり

// OK チェック対象外
public class MyException extends RuntimeException {
    private int errorCode;
    
    public MyException(String message, int errorCode) {
        super(message);
        this.errorCode = errorCode;
    }
}

OneTopLevelClass

トップレベルのクラス、インターフェース、enumアノテーションがそれ自身のソースファイルに存在することをチェックする。
1つのソースファイルに複数クラスが定義されていないこと。

プロパティ

なし

チェック設定例

<module name="OneTopLevelClass"/>

チェック実行例

ソースファイルFoo.javaに以下の記述があった場合

// OK
public class Foo {
  // methods
}

// NG Foo2.javaに記述するべき
class Foo2 {
  // methods
}

ThrowsCount

throws に指定された数以上の例外を記述していないかチェックする。
java.lang.Overrideアノテーションが付与されたメソッドは、現在のクラスがこれらのメソッドのシグネチャを変更できないため、チェック対象外。

プロパティ

プロパティ デフォルト値 説明
max int 4 throwsに記述できる例外の最大数
ignorePrivateMethods boolean true プライベートメソッドを検証対象外とするかどうか

チェック設定例

プロパティ設定なし

<module name="ThrowsCount"/>

プロパティ設定あり

<module name="ThrowsCount">
    <property name="max" value="2"/>
    <property name="ignorePrivateMethods" value="false"/>
</module>

チェック実行例

プロパティ設定なし

class MyClass {
    // NG throwsに記述できる例外は4個まで
    public void myFunction() throws CloneNotSupportedException,
                                ArrayIndexOutOfBoundsException,
                                StringIndexOutOfBoundsException,
                                IllegalStateException,
                                NullPointerException {
    }

    // OK
    public void myFunc() throws ArithmeticException,
                                NumberFormatException {
    }

    // OK privateメソッドはチェック対象外
    private void privateFunc() throws CloneNotSupportedException,
                                ClassNotFoundException,
                                IllegalAccessException,
                                ArithmeticException,
                                ClassCastException {
    }
}

プロパティ設定あり

class MyClass {
    // NG throwsに記述できる例外は2個まで
    public void myFunction() throws CloneNotSupportedException,
                                ArrayIndexOutOfBoundsException,
                                StringIndexOutOfBoundsException {
    }

    // OK
    public void myFunc() throws ArithmeticException,
                                NumberFormatException {
    }

    // NG 「ignorePrivateMethods=true」なのでチェック対象ーthrowsに記述できる例外は2個まで
    private void privateFunc() throws CloneNotSupportedException,
                                ClassNotFoundException,
                                IllegalAccessException {
    }
}

VisibilityModifier

クラスのメンバの可視性をチェックする。
static final、immutable、または指定されたアノテーションを持つメンバーのみ "public"とすることができ、その他のクラスメンバーは"private"とするべき。

プロパティ

プロパティ デフォルト値 説明
packageAllowed boolean false package-privateのメンバを許可するかどうか
protectedAllowed boolean false protectedのメンバを許可するかどうか
publicMemberPattern Pattern "^serialVersionUID$" チェック対象外とするpublicメンバのパターン
allowPublicFinalFields boolean false finalフィールドをpublicとして宣言することを許可するかどうか
allowPublic ImmutableFields boolean false finalクラスで定義された場合、immutableフィールドをpublicとして宣言することを許可するかどうか
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クラスの正規名を指定する
ignoreAnnotation CanonicalNames String[] com.google. common.annotations. VisibleForTesting, org.junit.ClassRule, org.junit.Rule メンバに付与していた場合にチェック対象外とするアノテーションの正規名を指定する

チェック設定例

プロパティ設定なし

<module name="VisibilityModifier"/>

プロパティ設定あり

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

チェック実行例

プロパティ設定なし

class MyClass {
    // OK
    @org.junit.Rule
    public TemporaryFolder publicJUnitRule = new TemporaryFolder();
    
    // OK
    @org.junit.ClassRule
    public static TemporaryFolder publicJUnitClassRule = new TemporaryFolder();
    
    // NG publicでメンバを宣言しない
    public String testString = "";
    
    // OK
    private String str = "aaa";
}

プロパティ設定あり

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";
}