Какое влияние оказывают на сериализуемость модификаторы полей static и final?
Модификаторы static и final ведут себя по-разному при стандартной сериализации (Serializable) и расширенной (Externalizable).
static-поля
Поля с модификатором static не сериализуются при стандартной сериализации, так как принадлежат классу, а не экземпляру. После десериализации статическое поле будет содержать текущее значение из JVM, а не то, которое было в момент сериализации.
При использовании Externalizable статическое поле можно записать и прочитать вручную, но это не рекомендуется — это побочный эффект, влияющий на все экземпляры класса, что ведёт к трудноуловимым ошибкам.
final-поля
При стандартной сериализации final-поля сериализуются и десериализуются как обычные поля — JVM обходит ограничение final через внутренние механизмы.
При использовании Externalizable final-поля невозможно десериализовать: конструктор по умолчанию инициализирует их начальным значением, а изменить в readExternal() уже нельзя.
Сводная таблица
| Модификатор | Serializable | Externalizable |
|---|---|---|
static |
Не сериализуется | Можно, но не рекомендуется |
final |
Сериализуется нормально | Невозможно десериализовать |
static final |
Не сериализуется (константа класса) | Можно записать, но бессмысленно |
На собеседовании: ключевое ограничение —
final-поля нельзя восстановить черезExternalizable, поэтому если в классе естьfinal-поля, нужно использоватьSerializable. Это частый вопрос-ловушка.