RFR [9] 8071472: Add field access to support setting, final fields in readObject

Peter Firmstone peter.firmstone at zeus.net.au
Thu Mar 19 10:35:33 UTC 2015


Chris / Peter,

Perhaps you could consider passing GetFields as a parameter to a static 
method (identified by an annotation) and use fieldSetter to change the 
fields before they're written?

That way it would be possible to not only avoid implementing readObject 
or writeObject, but to check invariants and be final field friendly.

Just a thought.

Peter.


> ------------------------------
>
> Message: 5
> Date: Wed, 18 Mar 2015 11:06:56 +0000
> From: Chris Hegarty<chris.hegarty at oracle.com>
> To: Alan Bateman<Alan.Bateman at oracle.com>,	Peter Levart
> 	<peter.levart at gmail.com>
> Cc: Core-Libs-Dev Libs<core-libs-dev at openjdk.java.net>
> Subject: Re: RFR [9] 8071472: Add field access to support setting
> 	final fields	in readObject
> Message-ID:<55095C50.3010605 at oracle.com>
> Content-Type: text/plain; charset=windows-1252; format=flowed
>
> On 17/03/15 13:42, Alan Bateman wrote:
>> On 17/03/2015 12:21, Peter Levart wrote:
>>> Hi Alan,
>>>
>>> I agree that not calling defaultReadObject() from readObject() and
>>> having a final field is potentially a bug. But need not be in case
>>> some other means of setting final fields was used (Unsafe or
>>> reflection). Some readObject() implementations in base module that
>>> Chris changed to use new API fall into this category. We can't track
>>> those usages, so to keep backwards compatibility, this checking has to
>>> be opt-in. Is there a more elegant way to opt-in? A
>>> @CheckFinalsAssignment annotation on the readObject() method?
>> I'm not sure that an annotation is right here. Instead then it might
>> work as a method on FieldSetter to enable strict checking.
> Peter suggested a method on FieldSetter to enable strict checking before
> too, and at the time I pushed back. After this discussion, I've come
> full circle, and maybe this opt-in style method is a reasonable
> compromise. Something like:
>
>    /**
>     * Checks that all final instance fields, declared by the class where
>     * the {@code readObject} callback is being invoked, have been set.
>     *
>     *<p>  This method is intended to be called as a final step after all
>     * final instance fields have been set.
>     *
>     * @throws InvalidObjectException if one, or more, final instance
>     *         fields have not been set
>     */
>    void checkAllFinalsSet() throws InvalidObjectException;
>
>
> ...and the user code would look similar to this, from java.io.File:
>
>     s.fieldSetter().set("path", p)
>                    .set("prefixLength", pLen)
>                    .checkAllFinalsSet();
>
> -Chris.
>
>
>
>
> End of core-libs-dev Digest, Vol 95, Issue 54
> *********************************************




More information about the core-libs-dev mailing list