JDK 1.1からは「JavaBeansというコンポーネント技術が使えると先に触れました。JavaBeansは、要するに「簡単に再利用できるようにしたコンポーネントの仕様」みたいなもんです。では、具体的にJavaBeansってどんなもんでしょうか。今までいくつか1.1ベースのアプリケーションを作りました。これらのプログラムは「JavaBeans」なのでしょうか。
例えば、最初に作った「KeisanBean」は?
これは、イエスでもあるしノーでもあります。つまり、前回書き換えて作成したソースコードはJavaBeansとしての基本的なルールに従っていますから、Bean(JavaBeans準拠で作られたコンポーネントのことをこう呼びます)として扱うことはできるはずです。が、しかし先のソースだけではBeanとしては不完全なのです。完全に再利用可能なBeanにするには、もう少し考えなくてはいけません。
作成したJavaのプログラムがJavaBeansとして認識されるには、以下のような条件を満たしていなければいけません。
1.クラスと同じ名前のパラメータを持たないコンストラクタがある。
「コンストラクタ」というのは、クラスと同じ名前で定義されるメソッドですね。クラスをインスタンス化するとき、これを元に構築されます。JavaBeansとして使うには、パラメータを持たないコンストラクタが用意されていなければいけません。
2.抽象クラスであってはならない。
抽象クラスとはインスタンス化されないクラスのことです。JavaBeansは実際に対応ツールで組み込んで使えなければいけませんから、抽象クラスであってはなりません。
3.パッケージ化されている。
これは絶対必要ではありませんが、通常、JavaBeansはクラスファイルの状態ではなく、「JAR(Java Archive)」という特殊なファイルにパッケージ化されています。Javaはいくつものクラスが組み合わせられていますから、それぞれのファイルがばらばらにあったのでは、コンポーネントとしてうまく利用することができません。そこで、必要なファイル類をすべて1つのファイルにまとめ、圧縮して利用できるようにしておく必要があるのです。
以上のような点から、先に作成したKeisanBeanは完全なBeanではないといえるでしょう。なぜなら、一応デフォルトのコンストラクタはありますが、パッケージ化されていないからです。
では、どうすればパッケージ化できるのでしょうか。まず必要なのは、ソースコードの修正です。といっても、これは実は簡単。ソースコードの一番最初に、
package keisanBean;
このように書き加えればいいのです。「keisanBean」というのは、パッケージファイルの名前です。このように書き加えてjavacでコンパイルをし直してください。
この「package」というものは、特にJavaBeans用に用意された命令というわけではありません。これは、複数のクラスを一つのファイルにまとめてもちゃんと内部のクラスにアクセスできるようにするためのものなのです。
Javaでは、クラスライブラリを使う時に「import java.applet.Applet」という具合に指定しますね。これは、javaのクラスライブラリのファイル内にあるものを指定していたわけです。packageを使うと、これと同様の事ができるようになります。例えば、「KeisanBean.class」の最初に上の「package keisanBean」を書いておき、後述する方法で「keisanBean」という名前のパッケージファイルにした場合、「import keisanBean.KeisanBean」とすれば同様にパッケージ内のこのクラスをインポートして使うことができます。
さて、パッケージ化するためには、ソースコードの修正とあわせてもう一つやらねばいけないことがあります。それは「マニフェストファイル」というものを作成するのです。
これは、JARファイル内にパッケージングされたファイルに関する情報をまとめたもので、このファイルを作成し、JARパッケージに組み込んでやる必要があるのです。
では、KeisanBean用のマニフェストファイルを作りましょう。
Manifest-Version: 1.0 Name: KeisanBean.class Java-Bean: True Name: MyBAdaptor.class以上を、「MANIFEST.mf」という名前のテキストファイルとして保存してください。これがマニフェストファイルです。
見ればわかりますが、マニフェストファイルは、以下のような形をしています。
《バージョン情報》 Name:《クラス名》 Java-Bean:《True/False》組み込まれているクラスそれぞれについて、JavaBeansとして利用可能かどうか設定してあるわけですね。
さて、ファイルが揃ったらJARファイルを作りましょう。JDK 1.1には「JAR」という、JARパッケージファイルを作成するためのMS-DOSベースのEXEが用意されています。これを使えば、作成したプログラムをパッケージ化できます。
では、実際にやってみましょう。現段階では、以下のファイルが作成されているはずですね。
KeisanBean.class
MyBAdaptor.class
MANIFEST.mf
では、これらのファイルをパッケージ化し、「keisanBean.jar」というJavaBeansのパッケージファイルを作ってみましょう。
現時点では1.1はWindowsとUNIX版しかなく、Macではリリースされていませんから、ここではWindowsの場合を想定して説明します。−−まずMS-DOSプロンプトを起動し、cd命令でこれらのファイルがまとめておかれている階層へと移動します。もしファイルが別々の場所にあるようでしたら、1つのフォルダにまとめて下さい。
移動したら、以下の命令をMS-DOSプロンプトより実行します。
jar cfm keisanBean.jar MANIFEST.mf *.class
これで、JavaBeansとして使えるKeisanBeanを内包したkeisanBean.jarファイルができました。JavaBeans対応のツールでこのファイルを開けば、ちゃんとJavaBeansとして利用できるはずです。
上の「jar」という命令は、ちょっとオプションが多くてややこしいですからざっと説明しておきましょう。jarは以下のような形になります。
jar 《オプション》《必要なファイル名》……《クラスファイル》
問題は《オプション》というやつです。これはいくつかありますが、ここでは、上記の命令で使用した3つだけ説明しておきましょう。
「c」−−新しくjarファイルを作成する。
「f」−−jarファイルのファイル名を指定する。
「m」−−マニフェストファイルのファイル名を指定する。
これらのオプションを使った場合の命令の書き方は、次のようになります。
jar cfm 《jarファイル名》《マニフェストファイル名》《クラス名》
クラスが複数ある場合は、全てのファイル名を1つ1つ書いてもいいし、「*.class」というようにワイルドカードで指定してもOKです。フォルダ内に必要以外のクラスファイルがないならば、このワイルドカードを使ったほうが便利でしょう。
というわけで、JavaBeansのjarパッケージを作るまでがなんとかできるようになりましたね!
では、プロパティを取り付けてみましょう。――JavaBeansにプロパティを組み込む場合には、いくつかのルールがあります。それは以下のようなものです。
1.クラスはシリアライザブルなものにする。
「シリアライザブル」というのは、値の保存が可能なクラスのことです。つまり外部からプロパティなどを操作した場合、その値を保存しておけるようにしておかないといけません。使う度にデフォルト状態に戻ったのではプロパティ設定の機能が生かされませんからね。
2.プロパティはプライベートな変数として用意する。
プロパティ自身をそのままパブリックなものとして用意しておくべきではありません。プロパティは、決まったルールに沿って作られたsetter/getterメソッドにより操作するようにしておく必要があります。
3.プロパティにはset/getするメソッドを用意する。
プロパティの操作は、そのプロパティの値を取り出すメソッド(getter)と値を書きかえるメソッド(setter)を用意し、それを呼び出して行なえるようにしておきます。
では、実際の組み込み方を説明しましょう。――まず、クラスをシリアライザブルにします。これは、クラス定義の書き方を少し変えるだけでできます。
public class 《クラス》 extends ○○ implements Serializable {
このように、最後に「implements Serializable」をつけたせば、そのクラスはシリアライザブルになります。これは簡単ですね。
では、実際のプロパティ定義の仕方です。これは、以下のようになります。
private 《変数》 = 《初期値》; public int get《変数》 () { return 《変数》; } public void set《変数》 (《パラメータ》) { 《変数》 = 《パラメータ》; }非常に簡単なプロパティの書き方はこのようになります。まず、privateで変数を定義します。そして、get○○というメソッドで変数をreturnするもの、set○○メソッドで変巣を変更するものを用意します。
たとえば「MyData」という文字列のプロパティを作りたいと思ったら、このようになるでしょう。
private String MyData = ""; public String getMyData () { return MyData; } public void setMyData (String str) { MyData = str; }これでMyDataプロパティの一丁上がり!というわけです。割と簡単でしょう?
では、先に作成した「KeisanBean」に、2つのフィールドの文字列を示すプロパティ「Request」「Answer」というプロパティを組み込んでみましょう。
package keisanBean; import java.io.*; import java.awt.*; import java.awt.event.*; public class KeisanAppBean extends java.applet.Applet implements ActionListener,Serializable { TextField TF1,TF2; Button MyB; private int Request = 0; private int Answer = 0; public KeisanAppBean (){ setLayout (null); TF1 = new TextField ("100"); add (TF1); TF1.setBounds (new Rectangle (10,10,70,20)); TF2 = new TextField ("100"); add (TF2); TF2.setBounds (new Rectangle (10,40,70,20)); MyB = new Button ("Click!"); MyB.addActionListener (this); add (MyB); MyB.setBounds (new Rectangle (90,10,50,50)); setBounds (new Rectangle (150,70)); } public void actionPerformed (ActionEvent e) { String str1; int num1,total; str1 = TF1.getText (); num1 = Integer.parseInt (str1); total = 0; for (int i=1;i<=num1;i++){ total = total + i; } str1 = Integer.toString (total); TF2.setText (str1); } public int getRequest () { return Request; } public void setRequest (int num) { Request = num; TF1.setText (Integer.toString (num)); } public int getAnswer () { return Answer; } public void setAnswer (int num) { Answer = num; TF2.setText (Integer.toString (num)); } }これで完成。――ここでは、テキストフィールドのテキストをプロパティとして設定できるようにしていますから、単に変数を書き換えるだけではなく、もうちょっとひねってあります。
public void setRequest (int num) { Request = num; TF1.setText (Integer.toString (num)); }setRequest ()を見ると、このように変数を書き換えて後、テキストフィールドのテキストをsetText ()で書き換えていますね。これを忘れると、JavaBeans対応のソフトでプロパティを書き換えてもテキストフィールドが変化しなくなってしまうから注意が必要です。
――というわけで、JavaBeansがどのようなものか、そのソースコードを中心にざっと説明してみました。もちろん、これだけではとてもJavaBeansが作れるようにはなりません。「JavaBeansは、こんな感じで書いてあるんだな」という程度のことだけわかれば十分でしょう。
まだJavaBeansは一般に普及しているとはいえない感じがします。JavaBeansが多く流通するようになる前に、ざっと概要だけでも頭に入れておけば、この先の勉強の手助けとなってくれるのではないかと思います。