バージョン 1.4 での JavaBeansTM Component API の 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 持続性委譲を使って、オブジェクトのグラフを、それを再作成する際に使用できる一連の StatementExpression に分割する。
XMLEncoder XML エンコーディングで文と式を生成する Encoder
PersistenceDelegate そのオブジェクトのクラスの public メソッドを使用して、ほかのオブジェクトの状態を表すオブジェクトを定義する抽象クラス。
DefaultPersistenceDelegate Bean に対してデフォルトで使用する持続性委譲。

長期的な持続性に関する詳細情報についてのリンクは「JavaBeans Component API」を参照してください。

その他に追加された API

バージョン 1.4 では次のクラスも追加されました。

クラス 説明
EventHandler サイズが小さく、持続性スキームで自動的に保存されるイベントリスナーの動的な生成をサポートする。
ExceptionListener 例外がスローされたと通知されるが、その後そこから回復が行われるリスナーを定義する。Bean の読み書き中にオブジェクトが回復可能な問題に直面したときに通知する例外リスナーを、XMLEncoder または XMLDecoder オブジェクトに登録する。
PropertyChangeListenerProxy PropertyChangeListener を実装し、固有のプロパティーを使用してグループに別の PropertyChangeListener (実際のイベントハンドラ) を提供するプロキシ。プロキシはプロパティーの変更イベントを実際のイベントハンドラに渡す。
VetoableChangeListenerProxy VetoableChangeListener を実装し、固有の制約プロパティーを使用してグループに別の VetoableChangeListener (実際のイベントハンドラ) を提供するプロキシ。プロキシは拒否可能なプロパティーの変更イベントを実際のイベントハンドラに渡す。

次のクラスには追加メソッドがあります。


Introspector の変更点

Introspector クラスが再実装され、パフォーマンスが改善されました。新しく実装されることで、Introspector クラスの動作が次のように変更されました。

ガベージコレクションとカスタム属性

v 1.4 では、BeanInfo が直接参照されていない場合にシステムのメモリーが不足したときは、BeanInfo をガベージコレクトできます。これは、BeanInfoSoftReference にラップすることで 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 © 1993, 2013, Oracle and/or its affiliates. All rights reserved.