目次 | |

5. 永続的な記憶域

5.1 目標

Java Beansは,記憶域の振舞いを,かなり広範囲に支援することが望ましい。 Java Beansは,既存のデータフォーマットを使用し, OLE又はOpenDoc文書への差込みを可能にするのがよい。例えば,Java Beansが, Word文書内のExcel文書のように見えるのがよい。

同様にこのことは,単に内部状態を保持したいが, それに関して触れたくない小さなJava Beanの共通事例として,“自明”としたい。

Java Beansが“固有の”Javaフォーマットを使用する場合には,その永続状態は, 異なったプラットフォーム間で移植性があることが望ましい。

すべてのJava Beansが,必ずしも永続状態をもたなくてよい。 しかし,特性を編集可能なビーンズは,典型的に,その変更を記憶し, 再ロードするための方法を提供する。
 

5.2 複合的な解

これらの異なった目的を達成するために,一つの複合的な解を提供する。 この解では,Java Beanは,自動的なJava直列化機構を使用するか, “外部化”ストリーム機構を使用するかのいずれかを選択する。 “外部化”ストリーム機構は,結果として得られるデータレイアウトに関する完全な制御を Java Beanに提供する。

Java Beans 1.0の一部として,Javaオブジェクト直列化機構をサポートする。 これは,Javaオブジェクトの集まりの内部状態を保存及び復元する自動的な方法を提供する。 詳しい情報については,Java直列化仕様書(0.2 参照)を参照のこと。

“外部化”は,クラスに対して,その状態の書込みに関する完全な制御を可能とする, 直列化内のオプションとする。 その結果として,任意の既存データフォーマットの模倣が選択可能となる。
 

5.3 記憶対象

ビーンを永続的とする場合,内部状態の適切な部分を記憶し, 類似した見かけ及び類似した振舞いをもって後に復元可能とする。 通常,ビーンは,そのすべての開示された特性に対して永続状態を記憶する。 ビーンは,特性を通じて直接アクセス可能でない付加的な内部状態も保存してよい。 これは,(例えば,)ビーンカスタマイザ(5.参照)を実行中になされる付加的な設計選択 又はビーン開発者が生成した内部状態を含むかもしれない。

ビーンは,他のビーンズを含んでもよい。 この場合,これらのビーンズを,内部状態の一部として記憶することが望ましい。

しかし,ビーンは,通常, (隣接する又は親コンテナの)外部ビーンズへのポインタを記憶しないほうがよく, むしろこれらの接続が, より高レベルのソフトウェアによって再構築されると期待するのがよい。 そこで,通常ビーンは,他のビーン又はイベントリスナへのポインタをマークするために, キーワード“transient”を使用することが望ましい。 一般に,コンテナが生成するあらゆるビーンズ間の配線を保持し, 必要に応じて,記憶及び復元するのは,コンテナの責任とする。

同じ理由で,通常イベントアダプタは,その内部フィールドを“transient”として, マークすることが望ましい。

5.4 生成された初期化コードによる永続性

ビルダツールは,すべての初期化されたビーンズの状態を保存及び復元するために, Java 直列化を使用してもよい。 しかし,その代わりに,ビルダツールは, 各ビーンズを正しい状態に再初期化するためのソースコードを生成する選択をしてもよい。

そこで,例えば,ビルダツールは,ビーンが生成されてから変化した特性を検査し, 同じビーンを配置するコードを生成し, ビーンの状態を設定する特性設定メソッドを呼び出すかもしれない。 次に例を示す。

	Wombat w = new Wombat();
	w.setBackground(new java.awt.Color(120,120,120));
	w.setWeight(15);

メソッド PropertyEditor.getJavaInitializationString() を使用して, その特性に対する初期値として動作する Java 文字列を取得できることに注意すること。

5.4.1 生成された初期化コードに関する制限

ビーンの状態を復元するために生成されたコードの使用に関して, 一つの重要な制限が存在する。 ビーンズの中には,特性としてアクセスできない内部状態をもつものもあるかもしれない。 例えば,データベースアクセサビーンは,ビーンカスタマイザを通じて, 自分自体を構成できる。 しかし,特性としては,その構成情報のすべてを開示していない可能性がある。 スプレッドシートビーンも, ユーザに設計時には枠内の値の入力を可能とするかもしれないが, これら枠内の値すべてを,特性として開示しないかもしれない。

これらの場合には,ビーン設計者は, ビーンの特性を単に保存し復元することによっては, ビーンを復元できない規定をするかもしれない。 これは,FeatureDescriptor の属性及び値の機構を使用して, ビーンの BeanDescriptor における“hidden-state” と名前の付いた属性を論理型の真と指定することで達成できる。

そこで,クラス BeanInfo で,次のとおりに記述することになるかもしれない。

	public BeanDescriptor getBeanDescriptor() {
		BeanDescriptor bd = new BeanDescritor(a.b.MyBean.class);
		bd.setName("SecretiveBean");
		bd.setValue("hidden-state", Boolean.TRUE);
		return bd;
	}

ビーンの状態を復元するためのソースコードを生成したいツールは, ビーンに対する BeanInfo を検査し,BeanDescriptor が, 真に設定した属性“hidden-state”をもっているかどうかを調べなければならない。 もっていれば,ビーンの状態を保存及び復元するためには, オブジェクト直列化及び/又は外部化を使用しなければならない。

5.5 永続性のまとめ

すべてのビーンズは,直列化又は外部化をサポートしなければならない。

アプリケーションが,Java 直列化 API を使って, ビーンの状態を保存及び復元することは,常に意味があるものとする。 (直列化 API は, 直列化可能なオブジェクト及び外部化可能なオブジェクト両方を処理する。)

ツールは,ビーンが属性“hidden-state”を指定していなければ, ビーンの状態を復元するために生成されたコードを使用することもできる。 属性“hidden-state”を指定している場合には,ビーンは, 直列化及び/又は外部化を使用して,保存及び復元しなければならない。


目次 | |