バージョン 1.4 での JavaBeansTM Component API の API 拡張 |
JavaBeansTM Component API |
このドキュメントでは、Java 2 Platform, Standard Edition バージョン 1.4 で java.beans パッケージに加えられた変更点について説明します。
長期持続性をサポートする新しい API
長期的な持続性 (long-term persistence) をサポートするために、次のようなクラスが追加されました。
クラス 説明 Statement
オブジェクトのメソッド呼び出しを表すオブジェクトで、引数を伴うことがある。 例えば、 a.setFoo(b)
Expression
結果を返す文。 例えば、 a.getFoo()
.XMLDecoder
XMLEncoder
を使って作成された XML ドキュメントを読むEncoder
持続性委譲を使って、オブジェクトのグラフを、それを再作成する際に使用できる一連の Statement
とExpression
に分割するXMLEncoder
XML エンコーディングで文と式を生成する Encoder
PersistenceDelegate
そのオブジェクトのクラスの public メソッドを使用して、他のオブジェクトの状態を表すオブジェクトを定義する抽象クラス DefaultPersistenceDelegate
Bean に対してデフォルトで使用する持続性委譲 長期的な持続性に関する詳細情報についてのリンクは JavaBeans Component API を参照してください。
その他に追加された API
バージョン 1.4 では次のクラスも追加されました。
クラス 説明 EventHandler
サイズが小さく、持続性スキームで自動的に保存されるイベントリスナーの動的な生成をサポートする ExceptionListener
例外がスローされたと通知されるが、その後そこから回復が行われるリスナーを定義する。 Bean の読み書き中にオブジェクトが回復可能な問題に直面したときに通知する例外リスナーを、 XMLEncoder
またはXMLDecoder
オブジェクトに登録するPropertyChangeListenerProxy
PropertyChangeListener
を実装し、固有のプロパティを使用してグループに別のPropertyChangeListener
(実際のイベントハンドラ) を提供するプロキシ。プロキシはプロパティの変更イベントを実際のイベントハンドラに渡すVetoableChangeListenerProxy
VetoableChangeListener
を実装し、固有の制約プロパティを使用してグループに別のVetoableChangeListener
(実際のイベントハンドラ) を提供するプロキシ。プロキシはプロパティの変更イベントを実際のイベントハンドラに渡す次のクラスには追加メソッドがあります。
PropertyChangeSupport
クラスには、登録されたプロパティ変更リスナーをすべて取得する、引数のないメソッド (getPropertyChangeListeners
) が含まれるようになりました。- 同様に、
VetoableChangeSupport
クラスには、登録された拒否可能な変更リスナーをすべて取得する、引数のないメソッド (getVetoableChangeListeners
) が含まれるようになりました。
Introspector の変更点
Introspector
クラスが再実装され、パフォーマンスが改善されました。 新しく実装されることで、Introspector クラスの動作が次のように変更されました。
FeatureDescriptor
は、BeanInfo
が返されるときにコピーされるのではなく、BeanInfo
ごとに共有されるようになりました。 この変更により、getBeanInfo
メソッドのパフォーマンスが向上します。 また、FeatureDescriptor
の属性/値が変化すると、その変化は、BeanInfo
がガベージコレクトされるまでgetBeanInfo
の呼び出しの間で持続します。 (BeanInfo
のガベージコレクションについては、「ガベージコレクションとカスタム属性」を参照してください。)
getBeanInfo
メソッドは、要求されたBeanInfo
のコピーを作成しなくなりました。 代わりに、BeanInfo
をキャッシュに保存してから返します。 必要であれば、返されたBeanInfo
に参照を保存し、flushFromCaches
メソッドでイントロスペクタのキャッシュから Bean のクラスをフラッシュして、以前の動作を得ることができます。
instantiate
メソッドで、兄弟ウィジェットまたはブートストラップクラスローダを使う特定のクラスをインスタンス化できない場合、現在のスレッドのクラスローダを使うクラスをロードしようとします。
ガベージコレクションとカスタム属性
v 1.4 では、
BeanInfo
が直接参照されていない場合にシステムのメモリが不足したときは、BeanInfo
をガベージコレクトできます。 これは、BeanInfo
をSoftReference
にラップすることでIntrospector
に実装されています。ガベージコレクトされる可能性があるため、
BeanInfo
内にカスタム属性を格納する方法も変わってきます。 特定のBeanInfo
がガベージコレクトされた場合、次にIntrospector.getBeanInfo
を呼び出してこのBeanInfo
を取得するとき、返されるオブジェクトにカスタム属性が含まれなくなります。この問題を避けるために、
BeanInfo
内にカスタム属性を格納する場合は、BeanInfo
を取得するたびに、必ずこれらの属性を設定してBeanInfo
を正しく初期化するようにしてください。 次のサンプルコードは、Bean 記述子のカスタムプロパティを設定してBeanInfo
クラスを初期化する方法を示しています。 プロパティ記述子、メソッド記述子、またはイベントセット記述子のカスタム属性についても、このコードと同様になります。BeanInfo beanInfo = getBeanInfo(SomeBean.class); BeanDescriptor beanDescriptor = beanInfo.getBeanDescriptor(); /* * Before using the BeanInfo, check to see if our custom * property has been initialized. (Even if we initialized * it before, if the BeanInfo has been garbage collected, * then we need to initialize it again.) Since our custom * property's value could be null, we define another property * to tell us if the custom property is initialized. */ if (beanDescriptor.getValue("myProperty_init") == null) { beanDescriptor.setValue("myProperty", someValue); beanDescriptor.setValue("myProperty_init", Boolean.TRUE); }
Copyright © 2002 Sun Microsystems, Inc. All Rights Reserved. |
Java ソフトウェア |