|
6/12 第 3日 |
||
今日は General Session がなくて、朝から Technical Session です。 個人的には今日は Tiger Day なのです。Generics, Metadata, Simple Formated I/O などのセッションに参加してきました。1 日 "虎の穴" 体験ツアーみたいなもんです。虎の穴といっても、若い人には分からないとは思いますけど... そして、Tiger Day であると同時に、Joshua Bloch Day でもあるわけですが... ^^;; それでは、本日のレポートです。
|
Technical Session |
||||||||||||||
今日、聴講したのは次の 4 セッションです。
今日ははずれがなくて、全部紹介したいぐらいなのですが、なにぶんにも時間がないので。とりあえず、できるところまで書いてみます。 TS-3063 Adding Generics to the Java Programming Language Genrics は C++ のテンプレートのようなものです。あくまでも、"ようなもの" であって、テンプレートではありません。 このセッションでは簡単に Generics の使い方などを説明して、その後、既存のものとどのようにマイグレートしていくかを説明しました。 マイグレートの方は省略します。なにぶんにも時間が足りないので。本当は大事だということは分かっているのですが。 Genrics の特徴として
そして、Genrics は
Generics の使用法はそれほど難しくありません。
見ればお分かりだ思いますが、キャストがありません。キャストが失敗したのが分かるのは、コンパイル時ではなく、ランタイム時です。Genrics を使用すればキャストがなく、コンパイル時に型チェックをするので安全です。 Generics を使ったクラスの定義の例です。
こんな書き方もできます。派生クラスが書けるということもそうなのですが、Collection クラスの containsAll メソッドのように、そのメソッドだけ Generics を使うこともできまさす。そのときは、public などの後に <T> のように記述します。
ワイルドカードも使用することができます。でも、* ではありません。? です。
スーパクラスを指定して派生クラスをワイルドカードというのもなんとなく分かりますが、<T extends ?> のような書き方も可能です。 なんとなくでも分かりました??
TS-3072 Forthcoming Java Programming Language Featurers Tiger における言語仕様の変更に関する部分を説明するセッションです。スピーカは Joshua Bloch です。 言語の仕様変化は次のような原則に則って行われたそうです。
変更は 7 個所あるのですが、Generics と Metadata は他のセッションがあったので、省略します。 1. Enhance for Loop (like foreach) コレクションを使うとき、いちいちイテレーションするのは面倒くさいですね。そこで、こんな風にかわりました。
list の要素は o に代入されて、要素があるだけループします。 ただ、実際に要素を使うときにはキャストをしなくてはいけないのですが、Generics を使えばもっと簡単になります。 配列もコレクションと同じように使用することができます。 2. Autoboxing/Unboxing これも便利です。プリミティブとプリミティブのラッパークラス間の代入を = を使って行うことができるようになりました。
コレクションもこれを使えば、いちいちラッパーを使用せずに使えます。
すごいすっきりしたと思いませんか? 3. Typesafe Enum Bloch が書いた Effective Java の中に Typesafe Enum のことが書いてありますが、それは自分で Enum のためのクラスを書かなくてはなりませんでした。Tiger では、それをすぐに使うことができます。 ちなみに、通常の定数で Enum もどきを実現した場合の欠点は
次のように使うことができます。
enum の VALUE が要素全体を表わすコレクションのようです。 フィールドやメソッドを持つ enum も作成できます。
switch にも使用できます。また、enum の名前が名前空間になるので、同じもの (下の例では nikel が同じ) でも区別することができます。
4. 可変長引数 今まで、Java で C のようなメソッドの可変長引数を実現するには配列を用いていましたが、これも面倒です。可変長変数を実現するために新たに ... (ピリオドが 3 つ) が導入されています。 使い方は C の場合と代わらないです。
第 1 引数には可変長のものは使用できません。 これはフォーマット付き出力を行うために導入されたようです。 5. 定数インポート 定数を使うときにはクラス名を書く必要があります。それを回避するためにインタフェースで定数を定義して、implements する方法もあります。しかし、これは本来のインタフェースの使い方ではありません。 そこで、Tiger では import 文で定数をインポートできるようになりました。
このように import 文で、クラスの定数を書くようにします。ワイルドカードはすべての定数をインポートするために使用されます。上記の例では Math クラスの定数すべてをインポートしています。 ああ、長かった。
|
Birds of a Feather (BOF) Session |
||||||||||||||||||||||||||
今日は 4 つのセッションに参加しました。
BOF-3094 A Metadata Facility for the Java Programming Language スピーカは再び Joshua Bloch です。 すいません、ぜんぜんわかりません。聞けば聞くほど分からなくなります。 なぜ、メタデータが必要なのかについては次のようなことを示していました。
ようするに "現状では定義と実装が分かれているけど、それは面倒くさいね" ということや、"BeanInfo クラスみたいに付随するクラスがあるとメンテナンスが面倒だね" ということなのでしょう。 また、メタデータを使用することの利点は
セッションでは詳細な書き方よりは、例をいっぱい出してくれました。とりあえず、その例を書いておきます。 まずは JAX-RPC のサーバの例です。
インタフェースとコンクリートクラスが一緒になったのはわかるのですが、WebMethod というのはなんなんでしょう? 基調講演とか J2SE Road Map セッションではここが @Remote だったのでなんとなく分かったのですが。 最後の New 3 にいたっては SoapOperation などというものまででてくるし... 次は EJB の生成の例です。
その次は EJB で Environment を検索する例です。
メタデータは次のような要素から構成されています。
アトリビュートの定義の例を下にあげておきます。
次は Annotation の例です。
特殊な例としてマーカーインタフェースがあります。メソッドを持たないインタフェースで、既存のライブラリでは Clonable や Serializable などがあります。
アトリビュートが 1 つの場合は、指定しなくても引数 (?) がそれになります。
Annotation を読み込むためにリフレクションが機能強化され、次のようなクラスも導入されました。
Annotation の読み方の例です。JavaDoc の API (Doclet) に似たような使い方をします。
分かりました? 私は、これを書いていて、何となく分かってきました。でも、詳細は分からないので、帰国したら JSR-175 を見てみることにします。
BOF-3113 How Tiger Language Changes Affect Your Favorite APIs Tiger では言語仕様が変化するため、既存のライブラリもずいぶん様変わりするようです。どんなクラスがどのように変化したかを解説するセッションです。スピーカは引き続き Joshua Bloch です。 一番、影響の大きいのは Generics のようです。 変更があった代表的なものは
Language Support 言語仕様に関わるようなクラスです。
Iteratable は多分新しいインタフェースです。Generics を使ったイテレータを取得するメソッド iterator を定義するインタフェースです。 Reflection リフレクションは可変長引数が使えることによる変更が多いです。例えば Method#invoke などで可変長引数が使えるようになります。
Collections もっとも Generics の影響が大きいのがコレクションでしょう。
Text Format フォーマット関連のクラスは可変長引数による変更です。
Uses o Covariant Methods メソッドの引数が自分自身になるようなメソッドなのでしょう。詳細は分かりませんが、多分 Generics による変更があるのだと思います。
全体を通してみると、やはり Generics ですね。今から、勉強しておかねば。
|
|