単一の例のモードとそのプロローグ/反プログレッシブ
1506 ワード
一例クラスをシリアル化するためには、声明に「implemens Serializable」を追加するだけでは不十分です。シリアル化されたオブジェクトは、シリアル化されるたびに、元のオブジェクトだけでなく新しいオブジェクトを作成します。このような状況を防止するために、一例クラスにreadResolive方法を追加することができます。
まず、簡単に次のオブジェクトのプロローグを振り返ってみます。一般的には、クラスの一つがSerializableインターフェースを実現しています。メモリに書いてメモリから読み出します。「組み立て」は元と同じ対象になります。しかし、プログレッシブが一例に会った時、この中に問題があります。メモリから読み出して組み立てたオブジェクトは一例の規則を破壊しました。一例ではJVMの中に一つの種類のオブジェクトしかないことが要求されますが、今は逆順序化によって新しいオブジェクトがクローン化されました。
次の例に示します
まず、簡単に次のオブジェクトのプロローグを振り返ってみます。一般的には、クラスの一つがSerializableインターフェースを実現しています。メモリに書いてメモリから読み出します。「組み立て」は元と同じ対象になります。しかし、プログレッシブが一例に会った時、この中に問題があります。メモリから読み出して組み立てたオブジェクトは一例の規則を破壊しました。一例ではJVMの中に一つの種類のオブジェクトしかないことが要求されますが、今は逆順序化によって新しいオブジェクトがクローン化されました。
次の例に示します
public final class MySingleton implements Serializable {
private MySingleton() { }
private static final MySingleton INSTANCE = new MySingleton();
public static MySingleton getInstance() { return INSTANCE; }
}
MySingletonオブジェクト(getInstance方式で得られたその単一のオブジェクト)をプログレッシブにしてメモリから読み出すと、全く新しいMySingletonオブジェクトが存在します。単一のパターンはどのように維持されますか?これはreadResoliveの方法を使います。以下の通りです。
public final class MySingleton implements Serializable{
private MySingleton() { }
private static final MySingleton INSTANCE = new MySingleton();
public static MySingleton getInstance() { return INSTANCE; }
private Object readResolve() throws ObjectStreamException {
// instead of the object we're on,
// return the class variable INSTANCE
return INSTANCE;
}
}
このようにJVMがメモリから順を追って新しいオブジェクトを組み立てると、自動的にこのreadResolive方法を呼び出して私たちが指定したオブジェクトに戻ります。一例の規則も保証されます。