|
JavaTM 2 Platform Std. Ed. v1.4.0 |
||||||||||
| 前のクラス 次のクラス | フレームあり フレームなし | ||||||||||
| 概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド | ||||||||||
java.lang.Object | +--java.beans.PersistenceDelegate
PersistenceDeligate クラスは、クラスの公開 API に含まれるメソッドによって指定のクラスのインスタンスの状態を表現します。たとえば、この委譲モデルを採用している XMLEncoder などのストリームは、これまでのように持続性とクラス自体を関連付ける代わりに、ObjectOutputStream で使用される readObject メソッドと writeObject メソッドにより、その動作をクラスから切り離して管理することができます。通常、クラスは、この委譲スキーマを使ってこうした情報や規約を簡単に表現するのに最適の場所です。しかし、たった 1 つのクラスに些細な問題が含まれているだけで、オブジェクトグラフ全体の書き込みができなくなる場合もあります。この場合、アプリケーション開発者は、問題の発生しているクラスのシャドウをローカルで独自に作成するか、持続性を維持するためのその他の手法を採ることになります。こうした状況でこの委譲モデルを利用すれば、アプリケーション開発者は、アプリケーション自体には含まれないクラスの実装に変更を加えることなく、比較的クリーンな方法で直列化処理のあらゆる局面を制御することができます。
この持続スキーマは、委譲モデルを使用するという点だけでなく、対応する readObject メソッドなしで writeObject メソッドのアナログを要求するという点でも、従来の直列化スキーマとは異なっています。writeObject メソッドのアナログは、公開 API を使って個々のインスタンスをコード化します。直列化されたフォームの読み取り手続きは、Java 言語仕様に記されているとおり、メソッド呼び出しのセマンティクスによって定義されているため、readObject メソッドのアナログを定義する必要はありません。この手法で作成されたアーカイブが参照先クラスの非公開実装の変更の影響を受けないようにするには、バージョンごとに変化すると思われる writeObject と readObject の実装の依存関係を除去する必要があります。
以下のように、持続的なデリゲートは、オブジェクトの持続性に関するあらゆる局面を制御します。
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 |
| コンストラクタの詳細 |
public PersistenceDelegate()
| メソッドの詳細 |
public void writeObject(Object oldInstance,
Encoder out)
writeObject は、持続性を実現する唯一の手段として、Encoder により、従来の委譲モードで使用されます。このメソッドはファイナルではありませんが、通常、サブクラス化の必要はありません。
この実装は、最初に、ストリームがすでにこのオブジェクトを検出しているかどうかを確認します。次に、ストリームから返された候補が oldInstance の正確なコピーに変更可能かどうかを確認するため、mutatesTo メソッドが呼び出されます。変更可能な場合、initialize メソッドが呼び出され、初期化が行われます。変更できない場合、候補はストリームから削除され、instantiate メソッドの呼び出しにより、このオブジェクトの新しい候補が作成されます。
oldInstance - この式で作成されるインスタンスout - この式が書き込まれるストリーム
oldInstance を持つ式
protected boolean mutatesTo(Object oldInstance,
Object newInstance)
newInstance に一連の文を適用することにより oldInstance と等価のコピーを作成できる場合は true を返します。このメソッドの仕様では、公開 API に含まれている関連メソッドの動作を比較したとき、変更後のインスタンスと oldInstance を区別できない場合に、これらを「等価である」とします。なお、ここでは、まったく見分けのつかないコピーを生成することを妨げる hashCode や toString のようなメソッドがあることを考慮して、「すべてのメソッド」という表現ではなく「関連メソッド」という表現を使用しています。
2 つのインスタンスのクラスが同じ場合は、デフォルトで true が返されます。
oldInstance - コピーされるインスタンスnewInstance - 変更されるインスタンス
oldInstance に一連の変更を適用することによって、newInstance と等価のコピーを作成できる場合 true
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 を持つ式
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 Std. Ed. v1.4.0 |
||||||||||
| 前のクラス 次のクラス | フレームあり フレームなし | ||||||||||
| 概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド | ||||||||||
Java、Java 2D、および JDBC は米国ならびにその他の国における米国 Sun Microsystems, Inc. の商標もしくは登録商標です。
Copyright 1993-2002 Sun Microsystems, Inc. 901 San Antonio Road
Palo Alto, California, 94303, U.S.A. All Rights Reserved.