Pawel,

Pawel Veselov said the following on 11/10/09 07:30:
it again caught my attention, and I though that may be there is something that can be done about this. The issue is obvious -- having 'final transient' instance fields makes little sense if the object is ever serialized. Logically, there may be perfect reasoning behind making an instance field final, as well as transient, in which case there is then no mechanism to reinitialize this field on object deserialization.

Not quite true. This problem - that final fields can only be set during true construction and not during the pseudo-construction that occurs during deserialization - has been realized for a long time. As part of the Java 5 update we (I think it was done JSR-133) put in place the mechanism whereby you can use reflection to set a final field provided that setAccessible(true) has been invoked for that field. This is of course a limited solution as you must have the security capability to invoke setAccessible(true).

JSR-133 also addresses the Java Memory Model issues concerning deserialization of objects with final fields - see Section 17.5.3 of the Java Language Specification. (The notion of a "freeze action" on a final field was in part motivated by the deserialization issue).

David Holmes

It seems that it would be nice if either the final fields were initialized in a separate block that would be executed on deserialization, or if readObject() could set them. After all you can have a code block that sets the final fields. Not sure how feasible that is, but IMHO, that is a short coming.

--
With best of best regards
Pawel S. Veselov

Reply via email to