public abstract class PersistenceDelegate extends Object
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 により、従来の委譲モードで使用されます。 |
public void writeObject(Object oldInstance, Encoder out)
writeObject
は、永続性を実現する唯一の手段としてEncoder
により、従来の委譲モードで使用されます。このメソッドはファイナルではありませんが、通常、サブクラス化の必要はありません。
この実装は、最初に、ストリームがすでにこのオブジェクトを検出しているかどうかを確認します。次に、ストリームから返された候補がoldInstance
の正確なコピーに変更可能かどうかを確認するため、mutatesTo
メソッドが呼び出されます。変更可能な場合、initialize
メソッドが呼び出され、初期化が行われます。変更できない場合、候補はストリームから削除され、instantiate
メソッドの呼出しにより、このオブジェクトの新しい候補が作成されます。
oldInstance
- この式で作成されるインスタンス。out
- この式が書き込まれるストリーム。NullPointerException
- out
がnull
である場合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
である式。NullPointerException
- out
がnull
であり、この値がメソッドで使用されている場合protected void initialize(Class<?> type, Object oldInstance, Object newInstance, Encoder out)
newInstance
に対して、新しいインスタンスがoldInstance
と同等になるという副作用を及ぼす一連の文を生成します。このメソッドの仕様では、メソッドから値が返されたあと、公開APIに含まれるすべてのメソッドの動作を比較したとき、変更済みのインスタンスとnewInstance
を区別できない場合に、これらを「等価である」とします。
通常、実装は、oldInstance
とその公開可能状態のほかに、何が起こったかを示す一連の文を生成することにより、この目的を達成します。これらの文は、読込み時に入力ストリームの状態をシミュレートする複製された環境の要素が含まれた式を返すwriteExpression
メソッドにより、出力ストリームに送信されます。返される各文は、古い環境のすべてのインスタンスを新しい環境のオブジェクトで置き換えます。特に、こうした文のターゲットの参照(最初はoldInstance
への参照)は、newInstance
の参照として返されます。これらの文を実行すると、新しい環境のオブジェクトに変更が加えられるとともに、2つのオブジェクトの状態が徐々に近づいていきます。Initializeメソッドが返されるときには、公開APIで2つのインスタンスを区別することはできなくなっているはずです。もっとも重要なのは、これらのオブジェクトを等価にする手続きが出力ストリームによって記録され、ストリームのフラッシュ時に実際の出力を形成するという点です。
デフォルト実装は、この型のスーパー・クラスのinitialize
メソッドを呼び出します。
type
- インスタンスの型oldInstance
- コピーされるインスタンス。newInstance
- 変更されるインスタンス。out
- 初期化文が書き込まれるべきストリーム。NullPointerException
- out
がnull
である場合 バグまたは機能を送信
詳細なAPIリファレンスおよび開発者ドキュメントについては、Java SEのドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright© 1993, 2014, Oracle and/or its affiliates. All rights reserved.