JavaTM 2 Platform
Standard Ed. 5.0

java.beans
クラス PersistenceDelegate

java.lang.Object
  上位を拡張 java.beans.PersistenceDelegate
直系の既知のサブクラス:
DefaultPersistenceDelegate

public abstract class PersistenceDelegate
extends Object

PersistenceDeligate クラスは、クラスの公開 API に含まれるメソッドによって指定されたクラスのインスタンスの状態を表現します。たとえば、この委譲モデルを採用している XMLEncoder などのストリームは、これまでのように持続性とクラス自体を関連付ける代わりに、ObjectOutputStream で使用される readObject メソッドと writeObject メソッドにより、その動作をクラスから切り離して管理することができます。通常、クラスは、この委譲スキーマを使ってこうした情報や規約を簡単に表現するのに最適の場所です。しかし、たった 1 つのクラスに些細な問題が含まれているだけで、オブジェクトグラフ全体の書き込みができなくなる場合もあります。この場合、アプリケーション開発者は、問題の発生しているクラスのシャドウをローカルで独自に作成するか、持続性を維持するためのその他の手法を採ることになります。こうした状況でこの委譲モデルを利用すれば、アプリケーション開発者は、アプリケーション自体には含まれないクラスの実装に変更を加えることなく、比較的クリーンな方法で直列化処理のあらゆる局面を制御することができます。

この持続スキーマは、委譲モデルを使用するという点だけでなく、対応する readObject メソッドなしで writeObject メソッドのアナログを要求するという点でも、従来の直列化スキーマとは異なっています。writeObject メソッドのアナログは、公開 API を使って個々のインスタンスをエンコードします。直列化されたフォームの読み込み手続きは、Java 言語仕様に記されているとおり、メソッド呼び出しのセマンティクスによって定義されているため、readObject メソッドのアナログを定義する必要はありません。この手法で作成されたアーカイブが参照先クラスの非公開実装の変更の影響を受けないようにするには、バージョンごとに変化すると思われる writeObjectreadObject の実装の依存関係を除去する必要があります。

以下のように、持続的なデリゲートは、オブジェクトの持続性に関するあらゆる局面を制御します。

導入されたバージョン:
1.4
関連項目:
XMLEncoder

コンストラクタの概要
PersistenceDelegate()
           
 
メソッドの概要
protected  void initialize(Class<?> type, Object oldInstance, Object newInstance, Encoder out)
          newInstance に対して、新しいインスタンスが oldInstance と「等価」になるという副作用を及ぼす一連の文を生成します。
protected abstract  Expression instantiate(Object oldInstance, Encoder out)
          値 oldInstance を持つ式を返します。
protected  boolean mutatesTo(Object oldInstance, Object newInstance)
          newInstance に一連の文を適用することにより oldInstance と等価のコピーを作成できる場合は true を返します。
 void writeObject(Object oldInstance, Encoder out)
          writeObject は、持続性を実現する唯一の手段として、Encoder により、従来の委譲モードで使用されます。
 
クラス java.lang.Object から継承されたメソッド
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

コンストラクタの詳細

PersistenceDelegate

public PersistenceDelegate()
メソッドの詳細

writeObject

public void writeObject(Object oldInstance,
                        Encoder out)
writeObject は、持続性を実現する唯一の手段として、Encoder により、従来の委譲モードで使用されます。このメソッドはファイナルではありませんが、通常、サブクラス化の必要はありません。

この実装は、最初に、ストリームがすでにこのオブジェクトを検出しているかどうかを確認します。次に、ストリームから返された候補が oldInstance の正確なコピーに変更可能かどうかを確認するため、mutatesTo メソッドが呼び出されます。変更可能な場合、initialize メソッドが呼び出され、初期化が行われます。変更できない場合、候補はストリームから削除され、instantiate メソッドの呼び出しにより、このオブジェクトの新しい候補が作成されます。

パラメータ:
oldInstance - この式で作成されるインスタンス
out - この式が書き込まれるストリーム

mutatesTo

protected boolean mutatesTo(Object oldInstance,
                            Object newInstance)
newInstance に一連の文を適用することにより oldInstance と等価のコピーを作成できる場合は true を返します。このメソッドの仕様では、公開 API に含まれている関連メソッドの動作を比較したとき、変更後のインスタンスと oldInstance を区別できない場合に、これらを「等価である」とします。なお、ここでは、まったく見分けのつかないコピーを生成することを妨げる hashCodetoString のようなメソッドがあることを考慮して、「すべてのメソッド」という表現ではなく「関連メソッド」という表現を使用しています。

2 つのインスタンスのクラスが同じ場合は、デフォルトで true が返されます。

パラメータ:
oldInstance - コピーされるインスタンス
newInstance - 変更されるインスタンス
戻り値:
oldInstance に一連の変更を適用することによって、newInstance と等価のコピーを作成できる場合は true

instantiate

protected abstract Expression instantiate(Object oldInstance,
                                          Encoder out)
oldInstance を持つ式を返します。このメソッドを使って、指定されたオブジェクトの作成に使用するコンストラクタまたはファクトリメソッドの特徴を記述できます。たとえば、Field クラスの持続的なデリゲートの instantiate メソッドは、次のように定義されます。

 Field f = (Field)oldInstance;
 return new Expression(f, f.getDeclaringClass(), "getField", new Object[]{f.getName()});
 
返される式の値を宣言しているため、式の値は (getValue から返される値と同様に) oldInstance と同一になります。

パラメータ:
oldInstance - この式で作成されるインスタンス
out - この式が書き込まれるストリーム
戻り値:
oldInstance を持つ式

initialize

protected void initialize(Class<?> type,
                          Object oldInstance,
                          Object newInstance,
                          Encoder out)
newInstance に対して、新しいインスタンスが oldInstance と「等価」になるという副作用を及ぼす一連の文を生成します。このメソッドの仕様では、メソッドから値が返されたあと、公開 API に含まれるすべてのメソッドの動作を比較したとき、変更済みのインスタンスと newInstance を区別できない場合に、これらを「等価である」とします。

通常、実装は、oldInstance とその公開可能状態のほかに、何が起こったかを示す一連の文を生成することにより、この目的を達成します。これらの文は、読み込み時に入力ストリームの状態をシミュレートする複製された環境の要素が含まれた式を返す writeExpression メソッドにより、出力ストリームに送信されます。返される各文は、古い環境のすべてのインスタンスを新しい環境のオブジェクトで置き換えます。特に、こうした文のターゲットの参照 (最初は oldInstance への参照) は、newInstance の参照として返されます。これらの文を実行すると、新しい環境のオブジェクトに変更が加えられるとともに、2 つのオブジェクトの状態が徐々に近づいていきます。Initialize メソッドが返されるときには、公開 API で 2 つのインスタンスを区別することはできなくなっているはずです。もっとも重要なのは、これらのオブジェクトを等価にする手続きが出力ストリームによって記録され、ストリームのフラッシュ時に実際の出力を形成するという点です。

デフォルト実装は、この型のスーパークラスの initialize メソッドを呼び出します。

パラメータ:
oldInstance - コピーされるインスタンス
newInstance - 変更されるインスタンス
out - 初期化文が書き込まれるストリーム

JavaTM 2 Platform
Standard Ed. 5.0

バグの報告と機能のリクエスト
さらに詳しい API リファレンスおよび開発者ドキュメントについては、Java 2 SDK SE 開発者用ドキュメントを参照してください。開発者向けの詳細な解説、概念の概要、用語の定義、バグの回避策、およびコード実例が含まれています。

Copyright 2004 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。