- Теперь вопрос в том, загружает ли сериализация класс снова, чтобы получить два экземпляра Элвиса?
Создается новый экземпляр Elvis (подражатель), но перегруженный метод readResolve
гарантирует, что он не будет возвращен как часть структуры данных, возвращаемой ObjectInputStream.readObject()
.
Имитатор Элвиса недоступен (или скоро станет недоступным) и собирается мусором.
- Если класс загружается только один раз, то у нас должен быть только один экземпляр Elvis, поскольку статические поля не сериализуются и не восстанавливаются во время десериализации и
В идеале да. На практике №
- Откуда поступает другой экземпляр Elvis, который разрешен для сборки мусора readResolve (не допускается выход из процесса десериализации). Это можно объяснить?
Процесс десериализации начинается с создания 2-го Элвиса (имитатора), но метод readResolve
гарантирует, что его никто никогда не увидит.
Чтобы понять, как и почему это так, вам нужно понять функцию, которую readResolve()
метод выполняет при десериализации, как указано здесь . По сути, когда метод readResolve()
возвращает INSTANCE
, он говорит: «Где бы вы ни собирались использовать имитатор в графе, который мы строим, используйте вместо этого настоящий Элвис».