(не обязательно) перегружен или даже переопределен.)
тивная Java # 77 утверждает, что мы должны использоватьreadResolve
сохранить гарантию Singleton во время сериализации. Они использовали пример.
public class Elvis implements Serializable{
public static final Elvis INSTANCE = new Elvis();
private Elvis() { ... }
public void leaveTheBuilding() { ... }
и они предлагают использовать
Если класс Elvis создан для реализации Serializable, для обеспечения свойства singleton достаточно следующего метода readResolve:
// readResolve for instance control - you can do better!
private Object readResolve() {
// Return the one true Elvis and let the garbage collector
// take care of the Elvis impersonator.
return INSTANCE; }
Этот метод игнорирует десериализованный объект, возвращая выделенный экземпляр Elvis, который был создан при инициализации класса.
Теперь вопрос в том, загружает ли сериализация класс снова, чтобы получить два экземпляра Элвиса?Если класс загружается только один раз, то у нас должен быть только один экземпляр Elvis, поскольку статические поля не сериализуются и не восстанавливаются во время десериализации иОткуда поступает другой экземпляр Elvis, который можно использовать для сборки мусора с помощью readResolve (не допускается выход из процесса десериализации). Это можно объяснить?