Найти в Дзене
DEBAGanov

Java 987. В чем проблема сериализации Singleton?

Для решения этой проблемы можно использовать один из следующих подходов:

  • Использовать Enum Singleton, который уже предопределен и обеспечивает единственный экземпляр в любых условиях, в том числе и после десериализации.
  • Объявить в классе Singleton методы readResolve() и writeReplace(), чтобы переопределить процедуры сериализации и десериализации. Это позволит возвращать существующий экземпляр Singleton при десериализации.
  • Организовать Singleton с помощью вложенного класса и статической инициализации. Этот подход обеспечивает ленивую инициализацию и инстанцирование объекта Singleton.

Проблема сериализации Singleton заключается в том, что при десериализации объекта Singleton может быть создан новый экземпляр класса, что противоречит принципам Singleton (то есть гарантированного существования только одного экземпляра класса). Эту проблему можно решить, переопределив методы readResolve() и writeReplace(). Пример:

public class Singleton implements Serializable {
private static final long serialVersionUID = 1L;

private Singleton() {
}

private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}

public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}

protected Object readResolve() throws ObjectStreamException {
return getInstance();
}

private Object writeReplace() throws ObjectStreamException {
return getInstance();
}
}

Этот подход гарантирует, что десериализованный объект будет таким же, как и объект, который был сериализован.

1606 вопрос-ответ по Java: https://github.com/DEBAGanov/interview_questions

Tелеграмм канал: https://t.me/DEBAGanov

Мое резюме: https://github.com/DEBAGanov