目次
表目次
ImplessBeanとは、interfaceを記述するだけで、アクセッサーメソッド(setterとgetterメソッド)の実装なしで JavaBeansを作成するためのライブラリです。名前も、IMPlementation-LESS BEANから来てます。 実装なしでJavaBeansを作成するなんて怪しげですが、Javaのリフレクション機能を利用して 実現しています。 なお、ここで述べるJavaBeansとは、value object(単なるデータの入れ物としてのオブジェクト。ロジックを含まない。) として利用されるJavaBeansを指しています。
ImplessBeanの一番簡単な使い方を示しましょう。 まず、作成したいJavaBeansのinterfaceを作成します。
public interface ICustomer { String getName(); void setName(String name); int getId(); void setId(int id); Date getBirthday(); void setBirthday(Date birthday); }後は、このinterfaceのクラスオブジェクトを引数に、ImplessBeanを呼び出して、 ICustomer interfaceを実装したJavaBeansを作成します。
ICustomer customer = (ICustomer) BeanFactory.newBeanInstance(ICustomer.class); customer.setName("虚実豆"); String name = customer.getName();このように、いちいちsetter/getterを実装せずにJavaBeans作成し利用することが できます。
ImplessBeanを使用して、JavaBeansの実装を省略することによって、次のようなメリットがあります。
JavaBeansの実装ミスによるバグを回避できる。Ex.Addressプロパティを取得したら名前が返ってきた。
実装したJavaBeansをテストする手間を削減できる。
java.util.Mapの代わりにImplessBeanで作成したJavaBeansを使用することで、 名前(Mapのキー)と型(Mapのバリューの型)に対して、コンパイラが静的なチェックを行ってくれる。 Ex.「Mapのキーに文字列を使用していて、タイプミスによりバグった」みたいなことを防げます。
複数のinterfaceを自由に組み合わせたJavaBeansを作成できる。
ImplessBeanを利用するには、ここ から最新のディストリビューションを取得します。 ディストリビューションは"implessbean-x.x.zip"というファイル名になっいます(x.xはバージョンを表します)。
入手したディストリビューションを展開します。\optというディレクトリの下にインストールするには、 次のようにします。
cd \opt jar xvf \path\to\implessbean-x.x.zip以上で、"\opt\implessbean-x.x"というディレクトリの直下に、"implessbean.jar"と含むいくつかのファイルやディレクトリが展開されます。 あとは、あなたのプログラムのコンパイルや実行時に、"\opt\implessbean-x.x\implessbean.jar"をクラスパスに加えるだけで、ImplessBeanを利用することができます。 ImplessBeanを利用するには、通常、クラスnet.sf.implessbean.BeanFactoryの メソッドnewBeanInstance(Class)を呼び出すだけです。 詳しくは、JavaDoc APIドキュメントを参照してください。
下記のサンプルプログラムのように利用します。
import net.sf.implessbean.BeanFactory; public class Sample { public static void main(String[] args) { MyBean myBean = (MyBean) BeanFactory.newBeanInstance(MyBean.class); myBean.setId(10); System.out.println(myBean.getId()); myBean.setName("name"); System.out.println(myBean.getName()); } } interface MyBean { int getId(); void setId(int id); String getName(); void setName(String name); }
ImplessBeanには、次のように制限や制約があります。
アクセッサーメソッドのオーバーロードはできません。たとえば、次のような同名メソッドを定義することはできません。
void setValue(int v); void setValue(long v);これは、現状では、JavaBeansの各プロパティの値の保持に、java.util.Mapを利用しており、 その際、プロパティ名をキーにしているためです。
遅い。内部的にjava.util.Mapを 利用しているため、インスタンスのフィールドにデータを格納するのと比べて、遅いです。 また、プリミティブ型はラッパ型に変換されるため、さらに遅くなります。 性能上のボトルネックとなるようであれば、ImplessBeanを使わない方がよいでしょう。 実際の測定結果では、利用するjava.util.Mapの実装にもよりますが、 80倍くらい遅くなります。
setterで値の制約をかけれない。たとえば、「nullは不可」や「10~20までの整数」 といったチェックをsetterで行えません。meta data(JSR 175)が一般的になったら、比較的一般的な 制約をサポートするかもしれません。
コンストラクタを利用できない。ImplessBeanを使う場合、ファクトリメソッドを利用して インスタンスを作成する必要があります。引数なしコンストラクタを要求するようなフレームワークなどには、 利用できないでしょう。
ここでは、ImplessBeanが有効に働く場面をいくつか説明します。 JavaBeansを利用する局面は年々増加しており、ImplessBeanを使える場面も 増えていくでしょう。
WebアプリケーションでビューをJSPで実現しているとき、サーブレットでの処理結果を JSPに渡すのに、一般にJavaBeansを使用します。しかし、ここで使用するJavaBeansは 特定のJSPに特化していることが多く、その場限りのクラスを多数作成しなければなりません。 このように、使用頻度の低いJavaBeansを多数利用する必要がある場合にImplessBeanは有効です。
次のようなテーブルからなるDBを利用するアプリケーションを考えてみましょう。
これら2つのテーブルからデータを取得する際、利用しないカラムのデータは取ってこない方が、メモリ的にもスピード的にも好ましいに決まっています。 大量のレコードを取り扱う必要がある場合は特にそうです。 6種類のカラムがありますから、理論上は63パターンの組み合わせがあります。 すべての組み合わせは必要ないとしても、必要最小限の項目からなるバリューオブジェクトを使おうと思うとすると、 たった二つのテーブルのだけでもかなりの数のバリューオブジェクトが必要になってしまいます。
ImplessBeanは、interfaceベースなので、次のように複数のinterfaceを組み合わせることもできます。
interface Dealer { int getCarId(); String getCarName(); String getDealerCompany(); } interface CarSpec { int getCarId(); String getPowerTrain(); String getMaxPower(); String getMaxTorque(); } interface CarSpecAndDealer extends CarSpec, Dealer { } ... CarSpecAndDealer value = (CarSpecAndDealer) BeanFactory.newBeanInstance(CarSpecAndDealer.class); ...このように、テーブルのJoinをinterfaceの多重継承という形で自然に扱うことができます。 上記の例では、1テーブル1 interfaceとしていますが、1カラム1 interfaceにすることで、 よりきめ細かなバリューオブジェクトを作成することができます。 このように、ImplessBeanを利用することにより、面倒なバリューオブジェクトの実装を簡素化することができます。