Sobes.tech
Middle+

Na czym polega problem serializacji przy użyciu wzorca Singleton?

sobes.tech AI

Odpowiedź od AI

Podczas serializacji obiektu Singleton domyślnie traci się gwarancję unikalności instancji.

Przyczyna:

  • Metoda readObject() domyślnie tworzy nową instancję klasy podczas deserializacji.

Problem:

  • Zamiast uzyskać odwołanie do istniejącej jedynej instancji, po deserializacji tworzone są drugie, a nawet trzecie instancje klasy Singleton.

Rozwiązanie:

  • Zaimplementować w klasie Singleton metodę readResolve(). Ta metoda jest wywoływana po deserializacji obiektu i powinna zwracać istniejącą instancję.
public class Singleton implements Serializable {

    private static final Singleton INSTANCE = new Singleton();

    private Singleton() {
        // Ochrona przed refleksją
        if (INSTANCE != null) {
            throw new IllegalStateException("Singleton już zainicjalizowany.");
        }
    }

    public static Singleton getInstance() {
        return INSTANCE;
    }

    // Metoda readResolve() zapobiegająca tworzeniu nowego egzemplarza podczas deserializacji
    protected Object readResolve() {
        return INSTANCE;
    }
}