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

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

Singleton - это шаблон проектирования, который обеспечивает создание только одного экземпляра класса в рамках одной JVM. Он достигается путем применения закрытого конструктора и статической переменной экземпляра класса.

Проблема с сериализацией Singleton в Java заключается в том, что при десериализации объекта, который является Singleton-ом, может быть создан новый экземпляр, что нарушает инварианты Singleton-а. Другими словами, после десериализации может оказаться, что у нас есть два экземпляра Singleton-а вместо одного, что не соответствует предназначению шаблона.

Есть два способа решения этой проблемы:

  • Переопределить методы readResolve() и writeReplace() в классе Singleton, чтобы гарантировать, что при десериализации всегда будет возвращаться единственный экземпляр Singleton-а. Например:
private Object readResolve() {
return INSTANCE;
}

private Object writeReplace() {
return INSTANCE;
}

Эти методы гарантируют, что при десериализации будет возвращен тот же экземпляр Singleton-а, что и при сериализации, то есть INSTANCE.

  • Использовать Enum для реализации Singleton-а вместо класса. ENUM Singleton не имеет проблем с сериализацией, поскольку JVM гарантирует, что каждый элемент перечисления создается только один раз. Например:
public enum Singleton {
INSTANCE;
}

В целом, использование Enum и переопределение методов readResolve() и writeReplace() - это два способа решения проблемы сериализации Singleton-а в Java.

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

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

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