目次 | 前の項目 | 次の項目 JavaBeans の拡張可能ランタイム包含関係およびサービスプロトコル


2.2 java.beans.beancontext.BeanContextChild インタフェース

環境のサポートまたは知識を必要としない単純な JavaBeans は、現在と同様将来も機能します。 ただし、包含する BeanContext を利用する JavaBeans および入れ子になった BeanContext の両方とも、認識している JavaBeans および入れ子になった BeanContext を使って、内包する BeanContext への参照の伝搬を可能にする機構を実装する必要があります。 提案されているインタフェースは次のとおりです。

public interface java.beans.beancontext.BeanContextChild {
	void        setBeanContext(BeanContext bc)
				throws PropertyVetoException;

	BeanContext getBeanContext();

	void addPropertyChangeListener
		(String name, PropertyChangeListener pcl);

     void removePropertyChangeListener
		(String name, PropertyChangeListener pcl);

	void addVetoableChangeListener
		(String name, VetoableChangeListener pcl);

     void removeVetoableChangeListener
		(String name, VetoableChangeListener pcl);

}
予想される使用法としては、サードパーティが BeanContext 上で定義された適切なメソッドの 1 つを呼び出して (コレクションからの継承により)、ターゲットの BeanContext のメンバシップに BeanContextChild を追加する場合が挙げられます。 その結果、BeanContext は、設定用メソッド setBeanContext() を呼び出して、BeanContextChild の「beanContext」プロパティを設定しようとします。 BeanContextChildsetBeanContext() メソッドを呼び出すことができるのは、BeanContext だけです。 この機構は、新たな BeanContext 値を保持する子の通知に BeanContext が使用する機構であるためです。 このプロパティは、アプリケーション構築用ツールを使ってユーザが直接設定したり、カスタマイズすることはできません。 このため、BeanContextChild 用の BeanInfo は、構築ツールがユーザにプロパティのカスタマイズを提示することのないように、このプロパティを隠された状態に設定する必要があります。

BeanContextChild オブジェクトは、PropertyVetoException をスローして、入れ子になった BeanContext が、特定の BeanContext 内で機能しないこと、または入れ子にならないことを通知することができます。 そのような拒否通知は、BeanContext によって、BeanContextChild がその特定の BeanContext 内で機能しない、つまりファイナルであると解釈されます。

BeanContextChildBeanContext への入れ子状態から解除している間、その子供または子の PropertyVetoEvents の「beanContext」プロパティに従うサードパーティが、PropertyVetoException をスローして、呼び出し側に入れ子解除状態ではないことを通知できます。 このやり取りを抑制するために、BeanContextChild またはサードパーティは、初期入れ子解除通知を拒否できます。 ただし、その後の通知を拒否することはできません。 そして、通知を受け取った後、自らの状態を通知に合わせて修正して、その後に実行される入れ子解除に備える必要があります。

このインタフェースを実装するクラスは、java.beans.PropertyChangeListener の (サブ) インタフェースのイベントソースとしても動作します。 このため、その状態を適切に更新してから、適切な java.beans.PropertyChangeEvent をトリガする必要があります。 その際、propertyName には「beanContext」を、oldValue には以前に入れ子であった BeanContext への参照を、 newValue には新たに入れ子になった BeanContext への参照を指定して、入れ子になった BeanContext の値が変化したことをすべてのリスナーに通知します。

終了処理中の BeanContextChild インスタンス、または入れ子になった BeanContext は、終了前に階層から自らを引き出すために、入れ子になった BeanContext に対して remove() メソッドを呼び出します。


2.2.1 持続性に関する考慮事項

BeanContext 内で入れ子になった BeanContextChild のインスタンスは、一般に、入れ子になった BeanContext インスタンスへの参照を含むフィールドまたはインスタンス変数を、さらに可能であれば getService() メソッドを使って BeanContextServices インスタンスから取得したサービスを、定義します。

その種のインスタンスに持続性を持たせる作業の際、インスタンスが入れ子になった環境で間違ってオブジェクトに持続性を持たせてしまうことがないよう、インスタンスがフィールドまたはインスタンス変数を一時的なものとして定義するか、そのような状態が持続することがないようカスタムの持続性メソッドを実装する必要があります。

ターゲットオブジェクトの直列化が、内部で入れ子化したソース環境の大半も直列化する場合に、オブジェクトの直列化を介し、クリップボードを使用して行うオブジェクトインスタンスのカットおよびペーストなどの操作は正しく動作しないため、この要件は非常に重要です。


目次 | 前の項目 | 次の項目
Copyright © 1998-1999 Sun Microsystems, Inc. All Rights Reserved.