3

Can anyone explain to me what is this means? especially the bold lines.

To make a singleton class serializable, it is not sufficient merely to add implements Serializable to its declaration. To maintain the singleton guarantee, you have to declare all instance fields transient and provide a readResolve() method. Otherwise, each time a serialized instance is deserialized, a new instance will be created, leading, in the case of our example, to spurious Elvis sightings. To prevent this, add this readResolve() method to the Elvis class:

// Singleton with static factory
public class Elvis {
    private static final Elvis INSTANCE = new Elvis();
    private Elvis() { ... }
    public static Elvis getInstance() { return INSTANCE; }
    public void leaveTheBuilding() { ... }
}

// readResolve method to preserve singleton property
private Object readResolve() {
    // Return the one true Elvis and let the garbage collector
    // take care of the Elvis impersonator.
    return INSTANCE;
}

FYI: these lines are from Effective Java Book, Item 3

4

2 に答える 2

1

インスタンスへの参照を持つ 2 つのクラスがあるとします。SingletonClass

public class ClassA implements Serializable {

    private SingletonClass s = SingletonClass.getInstance();

}


public class ClassB implements Serializable {

    private SingletonClass s = SingletonClass.getInstance();

}

ClassAとのインスタンスClassBがそれぞれシリアル化されてから逆シリアル化される場合SingletonClass、メソッドを介して取得されるのgetInstanceではなく、永続ストレージから逆シリアル化されるため、両方とも の新しいインスタンスを作成します。

あなたが行ったようにシングルトンクラスを変更することにより、それを逆シリアル化すると、常に静的共有インスタンスが返されるため、各逆シリアル化は参照しますINSTANCE

于 2013-10-18T02:19:44.767 に答える