プログラミング応用b 第4回 『Javadoc、APIドキュメントの利用方法、アノテーション』


10. 【static インポート】

今回のメイントピックとは少し話題が離れるが,ここで static インポート (static import) について解説しておく。

Java の java.lang.Math クラスには,数学関連の定数や数学関数などの計算を行うのに便利なメソッドが(publicな) static メンバとして用意
されている。Java の API ドキュメントの java.lang.Math クラスのマニュアルを見て確認してみよう。

この Math クラスは,言ってみれば「数学に関する便利な機能をまとめる為だけに存在しているクラス」であり,Mathクラスのオブジェクトを生成
することはあまり意図されていない。

さて,Mathクラスの定数や関数を使ったソースコードの例を見てみよう(下図 )。 前期で学習したように,クラスの static メンバを使用するときは
staticメンバの前に「クラス名.」を付けなければならない。この場合は,staticなメンバ名の前に「java.lang.Math.」を付けることになるが,前期に
学習したように, java.lang パッケージは自動的にインポートされているので java.lang パッケージ名は省略できる。したがって,「Math.」をstatic
メンバ名の前に付けることになる。

UsingStaticMember.java

※「絶対値」とは, 0.0(ゼロ) からの距離のこと。1.0 と -1.0 は両方とも 0.0 から 1.0 だけ離れているのでその絶対値は両方とも 1.0 である。

上図に書いてる様に,Mathクラスのメンバは便利ではあるが, staticメンバを使用するときにいちいち Math. をつけるのは面倒では無いだろうか。
Mathクラスは名前が短いからまだいいが,これがもっと長い名前のクラスの sttaicメンバを多用する場合を考えると, その面倒さは想像できるだろう。

そこで,Java SE5.0 から導入されたのが, static インポート (static import) 機能である。

たとえば,ソースファイルの冒頭の import 宣言をするところで,


「完全限定名」については,前期授業を参照のこと。

と書いておけば,そのソースファイルの中では Math.PI と書かずに,「クラス名.」を省略して以下の様に書くことが出来るようになる。



先ほどのソースコードの例で static インポートを使った例を以下の示す。


また,同じクラスの staticメンバなら *(アスタリスク) を使うことで一括して static インポートできる(下図参照)。

この方法で,Mathクラスのstaticメンバを一括してstaticインポートした例を以下に示す。

StaticImport.java



●staticインポートの注意点

・デフォルトパッケージ内のクラスのstaticメンバをstaticインポートすることはできない

  通常のimport宣言も,staticインポートも,その後ろに完全限定名を書かなければならない事を思い出そう。たとえば,Mathクラスは java.lang
 パッケージに所属するので,完全限定名は java.lang.Math となり,「import static java.lang.Math.PI;」などと書くことができる。ところが,
 デフォルトパッケージは,そもそもパッケージの名称自体が存在しないので,パッケージ名も含めた完全限定名を指定することができない。つまり,
 デフォルトパッケージ内のクラスのstaticメンバをstaticインポートすることはできない(下図)。



ちなみに同じ理由で,デフォルトパッケージ内のpublicクラスを他のパッケージから利用するためにインポートすることはできない。


・多用は禁物

  staticインポートを使いすぎると,各メンバがどのクラスで宣言・定義されたものかわかりにくくなるので,注意すること。

・自クラスのメンバとの衝突

  また,以下の例のように自クラスのメンバ名とstaticインポートしたメンバ名が同じ場合は,自クラスのメンバ名の方が優先される。
 static インポートした方のメンバを使いたければ,結局,「クラス名.」を省略せずに書いてやる必要がでてくる(下図)。



戻る