9.2.3. リカバリおよび永続性

StateManager クラスはクラス階層のルート部分に存在し、オブジェクトの有効化、無効化、および回復を行います。例9.1「StateManager 実装」を参照してください。

例9.1 StateManager 実装

public abstract class StateManager
{
public boolean activate ();
public boolean deactivate (boolean commit);

public Uid get_uid (); // object’s identifier.

// methods to be provided by a derived class

public boolean restore_state (InputObjectState os);
public boolean save_state (OutputObjectState os);

protected StateManager ();
protected StateManager (Uid id);
};
オブジェクトは、1)回復可能、2) 回復可能および永続的あるいは、3)回復可能でも永続的でもないというように分類可能です。
回復可能
StateManagerは、オブジェクトに関する適切なリカバリ情報を生成、保持しようとします。このようなオブジェクトの有効期間は、オブジェクトを作成したアプリケーションの有効期間を越えないものとします。
回復可能かつ永続的
オブジェクトの有効期間は、そのオブジェクトを作成する、あるいはアクセスするアプリケーションの有効期限よりも長くなっています。リカバリ情報を保持するだけでなく、StateManager は、適時activate あるいは deactivate 操作を呼び出すことで、オブジェクトの既存ステートおよび永続ステートを自動的にload あるいは unload しようとします。
回復可能でも永続的でもない
リカバリ情報は保持されず、オブジェクトの有効化、無効化も自動試行されません。
オブジェクトが回復可能、あるいは回復可能かつ永続的であれば、StateManager は、アプリケーション実行中の様々な時点に、deactivate メソッド実行の一部としてsave_state メソッドを呼び出し、activate実行の一部としてrestore_stateを呼び出します。StateManager はユーザーレベルのステート変更を検知することができないため、プログラマはこれらのメソッドを実装しなければなりません。そしてプログラマは、オブジェクトステートのどの部分を永続化するか決定します。例えば、スプレッドシートの場合、値を再計算できるのであれば、全エントリを保存する必要がありません。例9.2「save_state の例」の例は、A、B、Cという整数のメンバ変数を含むExample クラスのsave_state 実装について示しています。

例9.2 save_state の例

public boolean save_state(OutputObjectState o)
{
    if (!super.save_state(o))
	return false;
      
    try
	{
	    o.packInt(A);
	    o.packInt(B);
	    o.packInt(C));
}
catch (Exception e)
    {
	return false;
    }
      
return true;
}                      

注記

クラッシュリカバリの仕組みに関する改善点を活用し、save_staterestore_state メソッドはすべてsuper.save_state および super.restore_stateを呼出す必要があります。