Checkstyle Javaルール

CheckstyleのJavaルールについて1つずつまとめます

CustomImportOrder

CheckStyle公式ドキュメント

検証環境

Checkstyleバージョン:10.3.3
Javaバージョン:17


チェック概要

チェック追加バージョン
Checkstyle 5.8

インポート宣言のグループが、ユーザーによって指定された順序で表示されるかどうかをチェックする。
ユーザによって順序を指定されていないインポートはインポートリストの最後に配置すること。

順序を構成するためのグループには以下の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;
    ```

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

ルールとルールの間にはセパレーター「###」を使用する。
THIRD_PARTY_PACKAGEとSTANDARD_JAVA_PACKAGEグループにRegExpを設定するには、thirdPartyPackageRegExpとstandardPackageRegExpオプションを使用する。

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

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

プロパティ

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

設定+チェック実行結果

プロパティ設定なし

設定ファイル記述方法

<module name="Checker">
    <module name="TreeWalker">
        <module name="CustomImportOrder"/>
    </module>
</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;

プロパティ設定あり

customImportOrderRules

順番のフォーマットを指定する。 ルールとルールの間にはセパレーター「###」を使用する。

設定ファイル記述方法

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

チェック実行例

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;

standardPackageRegExp

STANDARD_JAVA_PACKAGEグループに含めるクラスの正規表現

設定ファイル記述方法

<module name="Checker">
    <module name="TreeWalker">
        <module name="CustomImportOrder">
            <property name="customImportOrderRules" value="STATIC###STANDARD_JAVA_PACKAGE###THIRD_PARTY_PACKAGE"/>
            <property name="standardPackageRegExp" value="^java\."/>
        </module>
    </module>
</module>

チェック実行例

package com.company;

import static java.util.*;
import static java.io.*;

import java.time.*;
// NG STANDARD_JAVA_PACKAGEグループに含まれていない
import javax.net.*;

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

thirdPartyPackageRegExp

THIRD_PARTY_PACKAGEグループに含めるクラスの正規表現

設定ファイル記述方法

<module name="Checker">
    <module name="TreeWalker">
        <module name="CustomImportOrder">
            <property name="customImportOrderRules" value="STATIC###STANDARD_JAVA_PACKAGE###SPECIAL_IMPORTS###THIRD_PARTY_PACKAGE"/>
            <property name="thirdPartyPackageRegExp" value="^com\."/>
        </module>
    </module>
</module>

チェック実行例

package com.company;

import static java.util.*;
import static java.io.*;

import java.time.*;
import javax.net.*;

// NG THIRD_PARTY_PACKAGEグループに含まれていない(最後に書くべき)
import org.apache.commons.io.FileUtils;
import com.puppycrawl.tools.checkstyle.checks.imports.CustomImportOrderCheck;
import com.puppycrawl.tools.checkstyle.checks.imports.ImportOrderCheck;

specialImportsRegExp

SPECIAL_IMPORTSグループに含めるクラスの正規表現

設定ファイル記述方法

<module name="Checker">
    <module name="TreeWalker">
        <module name="CustomImportOrder">
            <property name="customImportOrderRules" value="STATIC###SPECIAL_IMPORTS###STANDARD_JAVA_PACKAGE"/>
            <property name="specialImportsRegExp" value="^org\."/>
        </module>
    </module>
</module>

チェック実行例

package com.company;

import static java.util.*;
import static java.io.*;

import org.json.JSONObject;

import java.time.*;
import javax.net.*;

// SPECIAL_IMPORTSグループに含まれるのでSTANDARD_JAVA_PACKAGEより上に書くべき
import org.apache.commons.io.FileUtils;

separateLineBetweenGroups

インポートグループの間に空白行を挿入するかどうか(デフォルト:true)

設定ファイル記述方法

<module name="Checker">
    <module name="TreeWalker">
        <module name="CustomImportOrder">
            <property name="customImportOrderRules" value="STATIC###SPECIAL_IMPORTS###STANDARD_JAVA_PACKAGE"/>
            <property name="specialImportsRegExp" value="^org\."/>
            <property name="separateLineBetweenGroups" value="true"/>
        </module>
    </module>
</module>

チェック実行例

package com.company;

import static java.util.*;
import static java.io.*;

import org.json.JSONObject;
import org.apache.commons.io.FileUtils; // NG 「separateLineBetweenGroups」がtrueなのでグループ間には空行を挿入するべき
import java.time.*;
import javax.net.*;

sortImportsInGroupAlphabetically

アルファベット順にするかどうか(デフォルト:false)

設定ファイル記述方法

<module name="Checker">
    <module name="TreeWalker">
        <module name="CustomImportOrder">
            <property name="customImportOrderRules" value="STATIC###SPECIAL_IMPORTS###STANDARD_JAVA_PACKAGE"/>
            <property name="specialImportsRegExp" value="^org\."/>
            <property name="sortImportsInGroupAlphabetically" value="true"/>
        </module>
    </module>
</module>

チェック実行例

package com.company;

import static java.util.*;
import static java.io.*; // NG 「sortImportsInGroupAlphabetically」がtrueなのでjava.utiよりも上に書くべき

import org.json.JSONObject;
import org.apache.commons.io.FileUtils;

import java.time.*;
import javax.net.*;