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