Checkstyle Javaルール

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

ImportControl

CheckStyle公式ドキュメント

検証環境

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


チェック概要

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

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

パッケージ名もしくはファイル名に基づいて、インポートを制御することができる。
パッケージを制御する場合、宣言されたパッケージ内のすべてのファイルとサブパッケージがこのチェックで制御される。
メインパッケージとサブパッケージの違いを指定するには、メインパッケージの中にサブパッケージを定義する必要がある。
ファイルを制御する場合、ファイル名のみを考慮し、TreeWalker で処理されるファイルのみを対象とする。ファイルの拡張子は無視される。

動作の簡単な説明:

  • クラスファイルに定義されたパッケージに対して、最も長くマッチするサブパッケージ(後の「カレントサブパッケージ」)またはimport制御ファイルに記述された最初のファイル名のマッチからチェックを開始する
    • ルートパッケージから始めて、サブパッケージまたはファイル定義のいずれかが現在のクラスのパッケージまたはファイル名と一致するかどうかを調べることで、最も長く一致するサブパッケージを見つける
    • ファイル名が最初に一致した場合、それが最長一致とみなされ、現在のファイル/サブパッケージとなる
    • 別のサブパッケージにマッチした場合、そのサブパッケージとファイル名が次に長くマッチするかどうか調べ、このプロセスを再帰的に繰り返す
    • サブパッケージやファイル名に一致するものがない場合,現在のサブパッケージが使われる
  • 同じサブパッケージ/ルート内のルールの順番は、XMLファイルでの宣言順で定義され、上(最初)から下(最後)の順となる
  • 現在のファイル/サブパッケージ内に一致する許可/不許可ルールがある場合、Check は最初の "allowed" または "disallowed" のメッセージを返す
  • 現在のファイル/サブパッケージの中に一致するallow/disallowルールがない場合、親サブパッケージでチェックを続ける
  • ルートレベル(import-control)を含むファイル/サブパッケージのいずれにも一致する許可/不許可ルールがない場合、インポートはデフォルトで不許可になる

プロパティ

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

設定+チェック実行結果

プロパティ設定なし

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

プロパティ設定あり

設定ファイル記述方法

<module name="Checker">
    <module name="TreeWalker">
        <module name="ImportControl">
            <property name="file" value="config/import-control.xml"/>
            <property name="path" value="^.*[\\/]src[\\/]main[\\/].*$"/>
        </module>
    </module>
</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;
// OK
import java.util.stream.IntStream;