readObject
всегда должен начинаться с defaultReadObject
или readFields
; writeObject
с defaultWriteObject
или putFields
. defaultReadObject
установит для вас поле final
.
Если вы хотите использовать readFields
, либо удалите final
, либо спрячьте во временное поле и внедрите readResolve
(обратите внимание, что оригинальный объект все еще будет доступен заинтересованным сторонам). Как правило, вы действительно не хотите прибегать к таким sun.misc.Unsafe
.
(Новая модель памяти Java (JMM), представленная в J2SE 5.0 (и реализованная в JDK 1.4), дает больше возможностей в способе оптимизации конечного поля. В примере кода вопроса поле инициализируется с помощью выражение постоянной времени компиляции выражение. Таким образом, я ожидаю, что оно будет встроенным (не проверено).)