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.hega...@oracle.com>
To: Alan Bateman<alan.bate...@oracle.com>,        Peter Levart
        <peter.lev...@gmail.com>
Cc: Core-Libs-Dev Libs<core-libs-dev@openjdk.java.net>
Subject: Re: RFR [9] 8071472: Add field access to support setting
        final fields    in readObject
Message-ID:<55095c50.3010...@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
*********************************************

Reply via email to