目次 | |

附属書 A JDK 1.02 における過渡的ビーンズ

A.1 目標

完全な 1.0 Java Beans 体系の機能の中には, JDK 1.1に付加されつつある自己反映性及び直列化などの Javaコアインタフェースに依存するものがある。

しかし,ビーンズの早期の開発及び展開を可能とするためには, 開発者が,JDK 1.0.2 で実行できるが, 最終的なビーンズ体系とも完全に互換性があるビーンズを, 生産できるようにしたい。

これを可能にするために, “過渡的”ビーンズのための規則の集合を定義する。 “過渡的”ビーンズは,Java Beans 1.0の体系に完全に従い, JDK 1.0.2 上で, 及び Netscape Navigator 3.0, Internet Explorer 3.0などのJDK 1.0.2が動作可能なシステム上で, 実行可能なアプレット及びアプリケーションを構築するために使用できる。

これらの過渡的ビーンズは,必然的に, 完全なビーンモデルの部分集合だけを使用する。 しかし,この部分集合は,基本的な特性,メソッド及びイベントの機構を含み, その結果として,過渡的ビーンは,JDK 1.0.2 環境内でも十分有効そなる。

これらの過渡的ビーンズは,主に, 主導的な最新のアプリケーションビルダツールでの使用を意図する。

A.2 マーカクラス

いくつかの場面で,Java Beans APIは, 与えられたクラスが与えられた役割を果たすと意図させることを決定するために, 特定のクラス又はインタフェースを“マーカ”として使用する。 例えば,イベントリスナクラスは,インタフェース java.util.EventListener を実装しなければならない。

過渡的 Beans は,イベント及び直列化のためのマーカを使用したほうがよい。 そうすれば,過渡的ビーンズを,完全な JDK 1.1 環境で使用するときに, これらマーカを正確に認識できる。 過渡的ビーンズは,マーカと同様に必要な三つの過渡的マーカクラス (sunw.util.EventObject,sunw.util.EventListener 及び sunw.io.Serializable) を使用することが望ましい。

この理由は,次による。

JDK 1.0.2 を使用する開発者に対して,単純に, 適切な JDK 1.1 マーカクラスを利用可能とすることはできる。 しかし,これらのマーカクラスは,すべて名前空間の java.* 部分に存在し, 多くの既存のブラウザは, java.* クラスのダウンロードを許すことを敬遠する。

この問題を解決するために,JavaSoftは, JDK 1.0.2 ブラウザへとネットワークを介してダウンロード可能な, 三つの暫定的なマーカクラス (sunw.util.EventObject,sunw.util.EventListener 及び sunw.io.Serializable) を使用可能としている。 これらのクラスは,1.0.2 では,ほとんど動作しないが,JavaSoftは, 本物のマーカクラスから正確に継承するこれらのクラスの置換え版を, JDK 1.1 の一部として,配布する予定である。

そこで,過渡的ビーンは,JDK 1.1 直列化機構と互換性があることを示すために, sun.io.Serializable から継承するかもしれない。 このビーンを JDK 1.0.2 システムにダウンロードする場合には, (基本的に空のインタフェースである)sunw.io,Serializable の JDK1.0.2 版を, ビーンの一部としてダウンロードできる。 これによって,そのビーンは,JDK 1.0.2 上で正しく実行可能となる。 しかし,同じビーンが JDK 1.1 システム上で実行される場合には, クラスローダは,java.io.Serializable から継承する sunw.io.Serializable の JDK 1.1 版を使用する。 直列化コードがビーンを調べる場合は,(推移閉包によって) そのビーンは,java.io.Serializable から継承することが分かる。 そこで,このビーンは,JDK 1.1 上で直列化可能となる。

A.3 過渡的ビーンの開発者のための規則

過渡的ビーンが,完全な JDK 1.1 アプリケーションビルダにおいても, 正確に使用可能とするために,ビーン開発者は,次の規則に従わなければならない。

A.4 アプリケーションビルダの責任

過渡期ビーンズを使用して, JDK 1.0.2 に適合するアプレット及びアプリケーションを生成可能とするためには, アプリケーションビルダツールは,次の点に従わなければならない。

A.5 過渡的ビーンの例

以下の例に示す三つのクラスは,次の条件を満たす過渡的ビーンを定義する。

a) “デバグ”と呼ぶ単純な論理型特性を取得し及び設定するために, 一対の特性アクセサメソッドをサポートする。
b) ビーンのスタイルイベントを起動する。

java.awt.Button から継承するので,ビーンは, 継承する様々なメソッドから推論可能な,“ラベル”特性,“前面”特性, “背景”特性及び“フォント”特性も,自動的に取得する。

例:

	//This class describes the event that gets generated when 
	//OurButton gets pushed.
	public class ButtonPushEvent extends sunw.util.EventObject {
		public ButtonPushEvent(java.awt.Component source) {
			super(source);
		}
	}

	//This interface describes the method that gets called when
	//an OurButton gets pushed.
	public interface ButtonPushListener extends sunw.util.EventListener {
		public void push(ButtonPushEvent e);
	}

	//The OurButton class is a very minimal bean that simply extends the
	//standard JDK 1.0.2 Button class to throw a bean event.
	public class OurButton extends java.awt.Button implements
						sunw.io.Serializable{
		private boolean dbg;
		private Vector listeners = new Vector();

		public OurButton() {
			this("press");
		}

		public OurButton(String label) {
			super(label);
		}

		//Register an Event Listener.
		public synchronized void
		addButtonPushListener(ButtonPushListener bl) {
			listeners.addElement(bl);
		}

		//Remove an Event Listener.
		public synchronized void
		removeButtonPushListener(ButtonPushListener bl) {
			listeners.removeElement(bl);
		}

		//Catch an old style AWT event and fire it as a new style event.
		public boolean handleEvent(Event evt) {
			if (evt.id == Event.ACTION_EVENT) {
				//Notify each our listeners.
				Vector 1;
				ButtonPushEvent e = new ButtonPushEvent(this);
				synchronized(this) {
					1 = (Vector) listeners.clone();
				}
				for (int i = 0; i< 1.size(); i++){
					ButtonPushListener bl = 
							(ButtonPushListener)1.elementAt(i);
					bl.push(e);
				}
			}
			return super.handleEvent(evt);
		}

		public boolean isDebug() {return dbg;}
		public void setDebug(boolean x) {dbg = x;}
	}

目次 | |