【レポート】
プロパティの定義方法はここまでに学んだので、次は、それらプロパティへの外部からのアクセス方法を学ぶ。文字列&リフレクションベースのアクセス方法が、どのように変わったかに注目してほしい。
まずはインスタンスのプロパティへのアクセス方法から。公開されているドキュメントでは、「.」演算子を用いた、フィールドへのアクセスと同様の文法でプロパティにアクセスすることが想定されている。
MyBean bean = new MyBean();
bean.name3 = bean.name2;
以前のドラフトでは「->」(アロー)演算子を用いるという案もあったが、決めかねているということだろうか。
以前、プロパティの情報はjava.beans.PropertyDescriptorのインスタンスに格納され、プロパティの名称やプロパティへのアクセスメソッドなどが格納されていた。PropertyDescriptorを取得するにはjava.beansパッケージのAPIを多少なりとも取り扱える必要があった。
今回のドラフトで提案されている方法は、言語自体にその仕組みを取り入れるというものだ。具体的には「#」演算子を追加し、「クラス名#プロパティ名」でプロパティの情報を取得できるようにする。プロパティの情報は、java.lang.Property(もしくはjava.lang.reflect.Property)で表される。Propertyクラスにはset()やget()といったメソッドがあり、プロパティの読み書きを非常に簡単に行える。
public class Author {
property String name;
property String lastname;
…
}
…
Author author = new Author("joe", "forax");
Property<Author, String> name = Author#name; // 「#」演算子でプロパティ取得
name.set(author, "remi"); // Propertyクラスのsetメソッドで、プロパティに値セット
String myname= Author#lastname.get(author);
java.beansパッケージを利用するのと比べ、非常にすっきりとしたコードになる。
プロパティの種類によって分岐するようなコードを書く場合、今までのように文字列比較を行っていては、コンパイル時のチェックが働かないため、言語仕様の変更も威力半減となる。
ということで、switch文を拡張して、そうしたコードに対してもコンパイル時のチェックを行えるようにする、という方法が考案されている。
プロパティの種類で分岐する必要が頻繁に生じるのは、前述したバウンドプロパティにより、プロパティ変更時のイベントハンドリングを行う場合だ。
「bound」キーワードを付与されたプロパティは、
<T> void propertyChanged(Property<beanType, ?> prop, T oldValue, T newValue)
というイベントハンドラがクラス内に見つからないとコンパイル時にエラーとなる(そのメソッドは親クラスから継承していてもよい)。
public class Person {
// 以下はバウンドプロパティ
public property String name bound;
public property int age bound;
// プロパティ変更時のイベントハンドラ
public <T> void propertyChanged(Property<Person, T> prop, T oldValue, T newValue) {
// プロパティの種類で分岐
switch(prop) {
case name:
System.out.println((String)newValue);
break;
case age:
System.out.println((int)newValue);
break;
}
}
}
以上が、現在のドラフトにおけるプロパティの仕様だが、いかがだっただろうか。
筆者はJavaにおけるこれ以上の文法変更に懐疑的な方ではあったのだが、やはり新しい文法を目の当たりにしてみるとその魅力は如何ともしがたいものがある。
ツールが進化し、アクセッサメソッドはIDEがほとんど自動生成してくれる時代だとはいえ、やはりsetter/getterメソッドで埋め尽くされたコードは可読性にも欠け、メンテナンス性も落ちるのは間違いない。そうした問題を一気に解決しようとする試みはやはり歓迎すべきだろう。
| ADI、3軸高gMEMS加速度センサ「ADXL377」を発表 [15:48 5/25] |
| TI、「MSP430」向けULP Advisorソフトウェア・コード解析ツールを発表 [15:44 5/25] |
| Spansion、最大容量8GBのSLC NAND型フラッシュメモリ製品ファミリを発表 [15:42 5/25] |
| NXP、高線形性と柔軟な電流設定を兼ね備えたデジタル広帯域VGAを発表 [15:32 5/25] |
| STとSoundchip、スマートオーディオアクセサリ向けソリューションで協力 [15:19 5/25] |
|
ペット販売会社による、動物用医薬品の販売がついにスタート [15:48 5/25] ライフ |
|
ADI、3軸高gMEMS加速度センサ「ADXL377」を発表 [15:48 5/25] エンタープライズ |
|
スマホ向け『みずほ銀行アプリ』、iPhoneなどiOS搭載端末でも利用可能に [15:47 5/25] ライフ |
|
マツダ、「CX-5」クリーンディーゼル車の試乗モニターキャンペーン募集開始 [15:47 5/25] ライフ |
|
TI、「MSP430」向けULP Advisorソフトウェア・コード解析ツールを発表 [15:44 5/25] エンタープライズ |
4つの診断で、自分の適性を見つめなおそう!
働くこと・挑戦し続けることへの思いを綴ったインタビュー
あなたにピッタリのアドバイスを読むことができます。
転職に必要な情報が収集できます
企業からアプローチのメッセージが届きます。