ImplessBeanユーザーズガイド

最終更新日: 2004年10月 20日


目次

1. ImplessBeanの概要
ImplessBeanとは何か
ImplessBeanのメリット
クイックスタート
ディストリビューションの入手
ディストリビューションのインストール
ImplessBeanの制限
2. どのようなときにImplessBeanが有効か?
サーブレットからJSPへ
DAOの結果

表目次

2.1. Dealers Table
2.2. CarSpecs Table

第1章 ImplessBeanの概要

ImplessBeanとは何か

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のメリット

ImplessBeanを使用して、JavaBeansの実装を省略することによって、次のようなメリットがあります。

  1. JavaBeansの実装ミスによるバグを回避できる。Ex.Addressプロパティを取得したら名前が返ってきた。

  2. 実装したJavaBeansをテストする手間を削減できる。

  3. java.util.Mapの代わりにImplessBeanで作成したJavaBeansを使用することで、 名前(Mapのキー)と型(Mapのバリューの型)に対して、コンパイラが静的なチェックを行ってくれる。 Ex.「Mapのキーに文字列を使用していて、タイプミスによりバグった」みたいなことを防げます。

  4. 複数の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の制限

ImplessBeanには、次のように制限や制約があります。

  1. アクセッサーメソッドのオーバーロードはできません。たとえば、次のような同名メソッドを定義することはできません。

    void setValue(int v);
    void setValue(long v);
    	
    これは、現状では、JavaBeansの各プロパティの値の保持に、java.util.Mapを利用しており、 その際、プロパティ名をキーにしているためです。

  2. 遅い。内部的にjava.util.Mapを 利用しているため、インスタンスのフィールドにデータを格納するのと比べて、遅いです。 また、プリミティブ型はラッパ型に変換されるため、さらに遅くなります。 性能上のボトルネックとなるようであれば、ImplessBeanを使わない方がよいでしょう。 実際の測定結果では、利用するjava.util.Mapの実装にもよりますが、 80倍くらい遅くなります。

  3. setterで値の制約をかけれない。たとえば、「nullは不可」や「10~20までの整数」 といったチェックをsetterで行えません。meta data(JSR 175)が一般的になったら、比較的一般的な 制約をサポートするかもしれません。

  4. コンストラクタを利用できない。ImplessBeanを使う場合、ファクトリメソッドを利用して インスタンスを作成する必要があります。引数なしコンストラクタを要求するようなフレームワークなどには、 利用できないでしょう。

第2章 どのようなときにImplessBeanが有効か?

ここでは、ImplessBeanが有効に働く場面をいくつか説明します。 JavaBeansを利用する局面は年々増加しており、ImplessBeanを使える場面も 増えていくでしょう。

サーブレットからJSPへ

WebアプリケーションでビューをJSPで実現しているとき、サーブレットでの処理結果を JSPに渡すのに、一般にJavaBeansを使用します。しかし、ここで使用するJavaBeansは 特定のJSPに特化していることが多く、その場限りのクラスを多数作成しなければなりません。 このように、使用頻度の低いJavaBeansを多数利用する必要がある場合にImplessBeanは有効です。   

DAOの結果

次のようなテーブルからなるDBを利用するアプリケーションを考えてみましょう。   

表 2.1. Dealers Table

Dealers
CarIdCarNameDealerCompany
1S2000Honda
2PriusToyota

表 2.2. CarSpecs Table

CarSpecs
CarIdPowerTrainMaxPowerMaxTorque
16MT184218
2Hybrid System57+50115+400

これら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を利用することにより、面倒なバリューオブジェクトの実装を簡素化することができます。