Import

概要

適切にインポートを行っている際に獲得できる実績です. 不必要なインポートを行ったり, static なインポートを行わないことによってプログラムの依存性が減少し, 変更を行いやすくなります.

タイトル
Reliance upon others

この実績には,以下の3つのルールが含まれます:

  • AvoidStarImports
  • AvoidStaticImport
  • RedundantImport

AvoidStarImports

* を用いた import 文がないかをチェックします. パッケージ等から * を用いてすべてのクラスをインポートすると,依存が強くなり,名前が衝突したり将来の変更に対応しにくくなったりします.

コード例

import java.util.*;  // !!! List しか使用していない場合は import java.util.List; にしましょう

public class Foo {
  private void bar() {
    List list = new List()<String>;
    doSomething(list);
    return;
  }
}

このルールのチェックには,Checkstyleの AvoidStarImport を用いています.

AvoidStaticImport

static import を用いたインポートを行っていないかチェックします.

コード例

import static java.lang.Math.max; // !!! static を用いたインポートを行っています

public class StaticClass {
   public staticClass(){
     int num1 = 10;
     int num2 = 20;
     int nmax = max(num1, num2);
     return max;
  }
}

このルールのチェックには,Checkstyleの AvoidStaticImport を用いています.

注釈

Javaには, static インポート という機能があります.例えば上のコード例で,通常のインポートを行って記述を行うと,以下のようになります:

import java.lang.Math.max; // 通常のインポート

public class StaticClass {
  public staticClass(){
    int num1 = 10;
    int num2 = 20;
    int nmax = Math.max(num1, num2); // クラスを指定する
    return max;
  }
}

static インポートを行うことによって,クラスの指定が必要なくなるというメリットがあります.しかし,static を用いたインポートを行うと,名前が衝突しやすくなります.

以下引用:

staticインポートを使いすぎると、インポートしたすべてのstaticメンバーでプログラムの名前空間が煩雑になるため、
プログラムが判読不可能になり、保守不可能になる可能性があります。
プログラムのコードを読んだ人は(プログラムの作成者が数か月後に読んだ場合でも)、
staticメンバーがどのクラスに属していたのか理解できないでしょう。

参考文献: staticインポート - Oracle Docs

RedundantImport

冗長なインポートを行っていないかチェックします.冗長なインポートとは,以下のことを指します:

  1. 重複した import 文がある,すなわち同じクラスを2回以上インポートしている
  2. java.lang パッケージからインポートを行っている
  3. 現在のパッケージと同じパッケージからインポートを行っている

コード例

package enshud.s1.lexer;

import java.io.IOException;
import java.lang.String;    // !!! `java.lang`からのインポートは必要ありません(2番目に該当)
import java.io.IOException; // !!! 同一のクラスをインポートしています(1番目に該当)
import enshud.s1.lexer.Lib; // !!! 現在のパッケージと同じパッケージからインポートを行っています(3番目に該当)

public class Lexer {
public static void main(final String[] args) {
  doSomething();
  }
}

このルールのチェックには,Checkstyleの RedundantImport を用いています.