Назад к вопросам
Middle+
70
questionbank

В чем заключается проблема сериализации при использовании паттерна Singleton?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

При сериализации Singleton-объекта по умолчанию теряется гарантия уникальности экземпляра.

Причина:

  • Метод readObject() по умолчанию создает новый экземпляр класса при десериализации.

Проблема:

  • Вместо получения ссылки на существующий единственный экземпляр, после десериализации создается второй, а то и третий экземпляр Singleton-класса.

Решение:

  • Реализовать в классе Singleton метод readResolve(). Этот метод вызывается после десериализации объекта и должен возвращать существующий экземпляр.
public class Singleton implements Serializable {

    private static final Singleton INSTANCE = new Singleton();

    private Singleton() {
        // Защита от рефлексии
        if (INSTANCE != null) {
            throw new IllegalStateException("Singleton already initialized.");
        }
    }

    public static Singleton getInstance() {
        return INSTANCE;
    }

    // Метод readResolve() для предотвращения создания нового экземпляра при десериализации
    protected Object readResolve() {
        return INSTANCE;
    }
}