import文には、以下の2種類があります(Java言語仕様より)。
単独の型インポート宣言(JLS §7.5.1)
完全限定名を指定して単独の型をインポートし、そのコンパイル単位のクラスやインタフェース宣言中で単純名による型の利用を可能にするもの。
オンデマンドの型インポート宣言(JLS §7.5.2)
完全限定名で指定したパッケージ中に宣言されているすべてのpublic型から必要に応じたインポートを行う。
import java.util.List; import java.util.ArrayList; import java.util.logging.Logger;
import java.util.*; import java.util.logging.*;
では、どちらのimport宣言を採用するべきなのでしょうか?
大半の書籍や教科書では、2.のオンデマンド方式を使用していますが、なるべく1.の単独方式を採用すべきです。
なぜならば、そのクラスが依存するクラスをimport文に明記することによって、ソースコードを見たときにそのクラスの設計情報を把握しやすくなります。ここで、多数のクラスをインポート宣言する場合に記述が大変だとか、使わなくなったクラスのインポート宣言を削除するのが大変だといった議論が出てきます。しかし、昨今のツールはインポート宣言の追加や削除をほぼ半自動でやってくれます。また、削除し忘れについてはオンデマンドの型インポート宣言でも同じことです。
次に、オンデマンドの型インポート宣言を使用すると、同じ名前の型が別パッケージにある場合、どのパッケージの型を使用しているのか判断することが難しいという問題があります。もし両方のパッケージをオンデマンド方式でインポート宣言していると、コンパイルエラーとなってしまいます。コンパイルを通すには、名前が重なっている型をソース中で完全限定名で指定するか、単独の型インポート宣言を使用する必要が生じます。
参考に、同じ型名が異なるパッケージに存在する例をいくつか以下に挙げます。
List: java.awt、java.util Date: java.sql、java.util Timer: java.util、javax.swing Map: java.util、javax.swing.text.html
Java 5.0 Tigerより導入された、クラスのstaticなメンバーをimportする構文です。こちらも単独のインポートとオンデマンドのインポートの2種類あります。
import java.util.Arrays.sort; import java.lang.System.out;
import java.lang.Math.*;
static importは、クラス型名よりも衝突に注意しなくてはなりません。コーディングは楽になるものの可読性・保守性の観点では分かり難さにつながるため、使わない方がベターです。
enumの列挙値は、暗黙的にstaticになるため、Static import文でimportすることができます。