kanizaのブログ

コンピュータ、ソフトウェア、映画、音楽関連や家族のことなど、思いついたことを書きます。

アノテーション

Java 5の新機能であるところのアノテーション(注釈)について調査(遅い?)。前にちょっとだけ試したとき、実行時に注釈情報がぜんぜん取得できなくって「どういうことだー」と思ったのだけど、実行時に使うには注釈に@Retention(RetentionPolicy.RUNTIME)という注釈をつけておかないといけないのだな。注釈の注釈。他にも、コンパイラによって破棄されるとか、classファイルにはあるけど実行時には無視されるとかっていうRetantionPolicyもある。

使い方がわかってきたので、さっそく、注釈を使って新しいフレームワーク機能を作ってみた。んー、なかなか良いね。たとえば、クラスごとに違った定数を返す場合とか、これまで多態性によって解決していたところも注釈で置き換えられるケースがありそうだ。ああいうのは、多態性っていうよりもまさにメタデータに相当するものと言えるからね。注釈ならインスタンスがなくても取得できる。

このあいだ、GoogleからGuiceというJava用DIコンテナが出た。特徴として、注釈とか総称型(Generics)をバリバリ使っている点があげられる。僕がお世話になっているPicoContainerJava 5以前にできたものだから、当然、注釈や総称型がない中で設計されている。Guiceはそういう機能をうまく使って、疎結合や制御の反転によって生じるわかりにくさとかキャストが必要なところとかを解消してくれている。さすが。

注釈とか総称型はライブラリやフレームワークの設計をかなり変えてしまうインパクトがある。以前に作られたやつは、そのまま簡単に「対応しました」って言えないケースもあるよね(総称型があればそもそも不要なメソッドとかありうるし)。Java 1.4の頃はそれらがないために無理な設計をしていたとも言えるんだよなー、そうとは気付かずに。いまもどっかでそういう無理をしながらウンウンうなっている今日この頃。