Attributeの話(1)
さて、今回から何度かに分けて.NETのAttributeの話をしようかと思います。
今回は自分のやっている2つのプロジェクト、Poderosa, Omega Chartの両方で使っているテクニックを例に、Attributeの使い方を説明します。
Attributeは一言でいうと「型情報を拡張する仕組み」で、.NETに触発されてかJ2SE5.0でも annotation として似たような仕組みが導入されました。Javaと.NETの両方でサポートされたとなれば今後普及するスタイルになるでしょう。うまくはまれば格好よくキマるプログラミングテクニックです。
型情報の拡張とは
こう言われても何を意味するのか、どう使うのかが分からない人はけっこういると思います。しかし、概念上は昔からあります。
たとえば、Javaではオブジェクトをロックしてから実行すべきメソッドを、synchronizedをつけて宣言します。
public synchronized void foo() {
...
}
...
}
このsynchronizedをつけると、オブジェクトのロック・アンロックはJavaVMがランタイムに自動的にやってくれるようになります。synchronizedはJava言語のキーワードとして定義されたものですが、メソッドに対してオブジェクトのロックについての付加情報を指示しているととらえることができます。
メソッドはもちろん型情報の要素なので、synchronizedキーワードは Java でいうところの annotation の同類と考えることができます。同様に、public, private, volatile, abstract といったキーワードも、クラス・メソッド・フィールドに追加的な意味を与えることができるという点で、型情報を拡張していると考えることができます。
これらのキーワードがなくても、同じ動作をするプログラムを書くことは可能です。ただし、手動でメソッドの同期をするコードを書くなどの手間が発生し、面倒くさいわけです。
ユーザ自身が拡張するとは
まとめると、型情報の拡張機能は、
- 何かの意味をランタイムに示すものである
- なくても動作上同じプログラムを書くことは可能だが、面倒くさい
といった特徴を持ったものということになります。
.NETのAttributeなり、Javaのannotationという機能が登場する前は、このような動作はプログラム言語の仕様であらかじめ決められたものしか使えませんでいた。(もちろん例外的な言語は存在していると思います)
これに対して、上記のような拡張機能をプログラマが定義できるようにしてやろう、というのがAttribute / annotationの発想です。
当然のことながら、独自に定義した拡張情報はVMには何の影響も与えません。拡張情報を解釈するところも自分で作る必要があります。だったら最初から普通にプログラムを書けばいいと思うかもしれませんが、そうではないのです。
実例の紹介は次回にします。
追記:次回はこちらです。
« blog論2005年バージョン | トップページ | 村上龍ってこんなにダメだったのか »
この記事へのコメントは終了しました。
コメント