新しい Java では、クラス内の static なメンバであるクラスメソッドやクラスフィールドをグローバル関数やグローバル変数のように(コード上では)振舞わせることができる static インポートと呼ばれる機能が追加されています。
static インポートを用いれば、java.lang.Math などのクラスメソッドを集めたユティリティ性の高いクラスのメソッドを、クラス名を省略して呼び出せるようになります。 例えば、円周率を求めるには Math.PI を指定しなければなりませんでしたが、static インポートを用いれば PI だけで参照することができるようになります。
static インポートは、パッケージをインポートする方法と同様に import キーワードを用いて次のように記述します。
import static インポート識別子
import static インポート識別子 . *
特定のクラスメンバを static インポートするには前者の限定名を用いた記法を使います。 例えば java.lang.Math.PI と書いた場合、PI クラスメンバがインポートされて、そのソースコードの中では PI だけで参照することができるようになります。
後者の * を末尾に指定した記法では、そのクラスに属する全ての static メンバをインポートすることを表します。 java.lang.Math.* と書いた場合、Math クラスの全てのクラスメンバがインポートされます。
従来の Java では、enum の存在がないため定数セットだけを宣言するインタフェースを用意して、そのインタフェースが宣言する定数を利用するクラスはインタフェースを実装するという習慣がありました。 Swing などでその種の設計を確認できますが、これはクラス内部でインタフェースの定数を参照する再に、インタフェースを実装することでインタフェース名を省略することができるという意味があります。 しかし、これはインタフェースを実装する本来の意味から離れており、エキスパートの設計者からは忌み嫌われていました。 static インポートを用いれば、この問題を解決することもできます。
import static java.lang.Math.PI; class Test { public static void main(String args[]) { System.out.println(Math.PI); System.out.println(PI); //OK } }
このプログラムは、Math.PI クラスフィールドを static インポートしているため、このソースコード内では Math を省略して PI だけでアクセスすることも可能です。
import static java.lang.Math.*; class Test { public static void main(String args[]) { System.out.println(PI); System.out.println(abs(-50)); System.out.println(toRadians(40)); System.out.println(toDegrees(0.7)); } }
今度は、* を用いて Math クラス内のすべての static メンバをインポートするプログラムです。 main() メソッド内では、PI クラスフィールド、abs()、toRadians()、toDegrees() クラスメソッドをクラス名を直接指定せずに記述しています。
enum 型を static インポートする場合、インポート対象の enum 型は何らかのパッケージ内に属していなければなりません。 無名パッケージに属している enum 型を static インポートすることはできません。