0

有効な Java - シングルトンの保証を維持するには、すべてのインスタンス フィールドを一時的に宣言し、'readResolve' メソッドを提供する必要があります。ここでフィールドを一時的であると宣言することによって、何が達成されるのでしょうか? サンプルは次のとおりです。

....
....
public final class MySingleton implements Serializable{
 private int state;
 private MySingleton() { state =15; }
 private static final MySingleton INSTANCE = new MySingleton();
 public static MySingleton getInstance() { return INSTANCE; }
 public int getState(){return state;}
public void setState(int val){state=val;}
private Object readResolve() throws ObjectStreamException {
  return INSTANCE; 
 }
    public static void main(String[] args) {
        MySingleton  c = null;
        try {
            c=MySingleton.getInstance();
            c.setState(25);
            FileOutputStream fs = new FileOutputStream("testSer.ser");
            ObjectOutputStream os = new ObjectOutputStream(fs);
            os.writeObject(c);
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        try {
            FileInputStream fis = new FileInputStream("testSer.ser");
            ObjectInputStream ois = new ObjectInputStream(fis);
            c = (MySingleton) ois.readObject();
            ois.close();
            System.out.println("after deser: contained data is " + c.getState());
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

「状態」変数を一時的として宣言するかどうかに関係なく、c.getState() gettign が 25 として出力されます。

4

3 に答える 3

0

「状態」変数を一時的として宣言するかどうかに関係なく、c.getState() gettign が 25 として出力されます。

readResolve() は MySingleton のプライベートな静的インスタンスを返し、逆シリアル化によって返されたインスタンスをオーバーライドするため、逆シリアル化されたオブジェクトを置き換えます。

于 2013-04-05T13:56:00.113 に答える
0
try {
            c=MySingleton.getInstance();
            c.setState(25);
            FileOutputStream fs = new FileOutputStream("testSer.ser");
            ObjectOutputStream os = new ObjectOutputStream(fs);
            os.writeObject(c);
            os.close();
 }

オブジェクトでその値を設定しているため、25 を取得しています。上記のコードを参照してください。答えが 15 であることを期待していたと思いますか?

于 2014-02-20T18:49:23.877 に答える