モジュール java.desktop
パッケージ java.beans

クラスPersistenceDelegate

  • 直系の既知のサブクラス:
    DefaultPersistenceDelegate


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

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

    次のように、持続的な委譲は、オブジェクトの持続性に関するあらゆる局面を制御します。

    • あるインスタンスを同じクラス内の別のインスタンスに変更できるかどうかを判断。
    • 公開コンストラクタまたは公開ファクトリ・メソッドの呼出しにより、オブジェクトのインスタンスを作成。
    • オブジェクトの初期化を実行。
    導入されたバージョン:
    1.4
    関連項目:
    XMLEncoder
    • コンストラクタの詳細

      • PersistenceDelegate

        public PersistenceDelegate​()
    • メソッドの詳細

      • writeObject

        public void writeObject​(Object oldInstance,
                                Encoder out)
        writeObjectは永続性への単一のエントリ・ポイントであり、従来の委任モードではEncoderによって使用されます。 このメソッドはファイナルではありませんが、通常、サブクラス化の必要はありません。

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

        パラメータ:
        oldInstance - この式で作成されるインスタンス。
        out - この式が書き込まれるストリーム。
        例外:
        NullPointerException - outnullである場合
      • 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である式。
        例外:
        NullPointerException - outnullであり、この値がメソッドで使用されている場合
      • 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メソッドを呼び出します。

        パラメータ:
        type - インスタンスの型
        oldInstance - コピーされるインスタンス。
        newInstance - 変更されるインスタンス。
        out - 初期化文が書き込まれるべきストリーム。
        例外:
        NullPointerException - outnullである場合