Десериализация полностью обходит конструкторы, по умолчанию создавая совершенно новый объект, если только класс не реализует readResolve() для возврата вместо этого существующего экземпляра. Одноэлементные перечисления полностью исключают это — JVM гарантирует, что десериализация преобразуется обратно в ту же константу перечисления без дополнительного кода.
Пример
// Classic GoF Singleton: enforced by the class itselfpublicclassConfigManager {
privatestaticfinalConfigManagerINSTANCE=newConfigManager();
privateConfigManager() {} // private constructor blocks any other instantiationpublicstaticConfigManagergetInstance() { return INSTANCE; }
}
Итог
Десериализация полностью обходит конструкторы, по умолчанию создавая совершенно новый объект, если только класс не реализует readResolve() для возврата вместо этого существующего экземпляра.
Как сериализация Java может незаметно создать второй экземпляр Sing… · Sobeso