|
Static Import |
||||
|
||||
定数って面倒くさくないですか。いちいちクラス名までつけなくてはいけないんですから。 例えば、Swing のプログラムだと
JFrame.EXIT_ON_CLOSE も BorderLayout.SOUTH も Color.CYAN も Color.WHITE も全部定数です。わざわざクラス名をつける必要があるのはご存知のとおりです。 名前が長いクラスなんかだと本当に頭にきませんか ? java.awt.KeyboardFocusManager クラスの BACKWARD_TRAVERSAL_KEYS 定数なんて最低ですね ^^;; 定数だけ定義してあるインタフェース (例えば javax.swing.SwingConstants インタフェース) を使って、意味もなくインプリメントするという方法もあります。しかし、この方法はインタフェースの本来の目的からは外れていますし、Joshua Bloch も Effective Java の中でこの方法を批判しています。 Static インポートを使えばこの面倒さを少しだけ解消してくれます。
|
|
||||
Static インポートは定数もクラスと同じように import 文で記述できるようにしようということです。 簡単な例を示しましょう。たとえば、先ほどの Swing の例は
と普通の import 文と並べて記述すれば
というようにクラス名を記述せずに、定数名だけで使用することができます。 Static インポートは正確には次のように記述します。 import static TypeName.Identifier; もしくは import static TypeName.*; のようにアスタリスクを使用することもできます。 先ほどの例では import static java.awt.Color.CYAN; import static java.awt.Color.WHITE; と書くこともできますが、次のように書くこともできます。 import static java.awt.Color.*; これだと Color クラスで定義されているすべての定数をインポートします。 もちろん、インポートできるのは static で定義してあるクラス変数です。
|
|
||||||
Static インポートというと定数だけインポートできるような感じを受けますが、実をいうと違います。 なんと、satic なクラスメソッドもインポートできます。たとえば、次のようなコードが書けてしまいます。
sin メソッドは Math クラスの static なクラスメソッドです。Static インポートすると、このメソッドもクラス名をつけずにコールすることができるようになります。さらにアスタリスクを使えば、一緒にインポートすることも可能です。
ただ、私はあまりアスタリスクを使うことはお勧めしません。というか、普通の import 文でもアスタリスクは使わないほうがいいと思っています。 これはプログラムの保守性に関わってくるのです。プログラムを作者でない第 3 者が見ているとき、見知らぬクラスが出てきたら、これがコアライブラリのクラスか自作したクラスかは import 文を見ることで分かります。アスタリスクが使われていたら、そのクラスがどのパッケージに属しているかが分からなくなってしまいます。 人にやさしいプログラミングが私のモットーなんです。 さて、それはさておき、クラスメソッド以外にもインポートできるものがあります。それは JSR-201 で一緒に導入された Enum です。 例を示しましょう。とても単純に Enum だけを定義したクラスを作りました。
これをインポートしてみましょう。Enum をインポートするときは Enum の型名まで記述する必要があります。
もちろん次のようにアスタリスクを使うこともできます。 import static abc.Card.Suit.*; |
|
||||
自分で定数を含んだクラスを作って、他のクラスでそれをインポートするときに気をつけなくてはいけないことがあります。 それは定数を定義したクラスは必ずパッケージに属していなくてはいけないということです。 先ほどの Card クラスは abc というパッケージでした。これをパッケージなしにしてみましょう。Card.java を次の EnumImportTest2.java と同じディレクトにおき、一番上の package 文を削除します。後はこれを呼び出すプログラムを作ります。
さて、これをコンパイルしてみましょう。
Card がパッケージとして認識されてしまっています。 これはもしかしたら、バグなのかもしれません。でも、なるべくパッケージはつけた方がいいですね。
|
|
||||
とはいうもののやっぱり気になる、裏側が。 そこでいつものように、逆コンパイラの Jad を使って調べてみました。 逆コンパイルしたのは MethodImportTest1 です。 Jad の結果は次のようになりました。
定数は展開されていて、static なクラスメソッドはちゃんと頭にクラス名が補完されていました。 同じように EnumImportTest1 も逆コンパイルしてみると
Enum もクラスメソッドと同じようにクラス名が補完されていて、Enum の型名も補完されているようです。
|
|
||||
Static インポートはなかなか便利です。 Static インポートを使っても、コンパイルすれば従来の方式に直してくれるだけなので、パフォーマンスの劣化などを心配せずにすみます。 これこそ Ease of Development ですね。
今回使用したサンプルはここからダウンロードできます。 参考
(Oct. 2003) |
|