Support for final modifier on fields
Web Server forum
Back To The Forum Home!Search!Private Messaging System

Web Server Talk Web Server Talk > Web Servers reviews > Apache Server configuration support > Apache JDO Project > Support for final modifier on fields




  Last Thread   Next Thread Next
  Show Printable Version Email this Page Subscribe to this Thread      Post New Thread    Post A Reply      

    Support for final modifier on fields  
cbeams


View Ip Address Report This Message To A Moderator Edit/Delete Message


 
09-22-07 12:11 AM

I'd like to point out a minor inconsistency in the spec (that  
actually caused me some trouble), as well as suggest a change:

Section 6.2, "Goals" reads:

6.2 Goals
The JDO Object Model has the following objectives:
• All class and field modifiers supported by the Java language  
including private,
public, protected, static, transient, abstract, final, synchronized,  
and volatile, should be supported by JDO
instances.

Having read this, I expected that I should be able to define fields  
within my PC classes as final, and everything would be OK.

This, however, is not true because of section 18.15:

Fields with modifier final: none. Accessors will be generated for  
these fields during
enhancement, but they will not delegate to the StateManager.

And is further explained in 22.10.2:

22.10.2 Final
A20.10.2-1 [Final fields are treated as non-persistent and non- 
transactional by the enhancer.] Final
fields are initialized only by the constructor, and their values  
cannot be changed after construction
of the instance. [Therefore, their values cannot be loaded or stored  
by JDO; accesses are not medi-
ated. This assertion is duplicated in chapter 18.]
This treatment might not be what users expect; therefore, final  
fields are not supported as persistent
or transactional instance fields, final static fields are supported  
by ignoring them.


"Bummer", thought I.


So, first of all, I'm suggesting that we at least modify 6.2 to call  
out the exception to the rule, explicitly stating that final fields  
are not supported.

Preferably, however, I suggest we change the spec to support final  
fields.  The statement in 22.10.2 that reads "final fields are  
initialized only by the constructor, and their values cannot be  
changed after construction of the instance" is actually incorrect.   
Reflecting on a final field and calling setAccessible(true) does in  
fact render it mutable to the caller.  This is all an implementation  
needs to do!

There's also the question of bytecode enhancement and the addition of  
a no-arg constructor; it would be reasonable for the enhancer to  
simply create a constructor that sets all the final fields to null;  
it's going to write over them anyway.


Perhaps I've missed something here, but I think the spec is just  
incorrect on this matter, and it would serve users well to support  
final on fields.  It was a huge disappointment for me when I first  
found out JDO didn't allow for this, as I use final liberally to  
ensure proper object construction.


Thanks,

- Chris Beams





[ Post a follow-up to this message ]



    Re: Support for final modifier on fields  
cbeams


View Ip Address Report This Message To A Moderator Edit/Delete Message


 
09-22-07 12:11 AM

A bit more on this topic.  It looks like the post-construction  
mutability of final fields was a change made in Java 5 per JSR-133.

Heinz Kabutz goes deeply into it here: http://www.javaspecialists.eu/ 
archive/Issue096.html

He even specifically calls out:

"It makes sense to allow updates to final  fields. For example, we  
could relax the requirement to have fields non-final in JDO."

Definitely give the article a read... interesting stuff.

- Chris


On Sep 21, 2007, at 1:31 PM, cbeams wrote:

> I'd like to point out a minor inconsistency in the spec (that  
> actually caused me some trouble), as well as suggest a change:
>
> Section 6.2, "Goals" reads:
>
> 6.2 Goals
> The JDO Object Model has the following objectives:
> • All class and field modifiers supported by the Java language  
> including private,
> public, protected, static, transient, abstract, final,  
> synchronized, and volatile, should be supported by JDO
> instances.
>
> Having read this, I expected that I should be able to define fields  
> within my PC classes as final, and everything would be OK.
>
> This, however, is not true because of section 18.15:
>
> Fields with modifier final: none. Accessors will be generated for  
> these fields during
> enhancement, but they will not delegate to the StateManager.
>
> And is further explained in 22.10.2:
>
> 22.10.2 Final
> A20.10.2-1 [Final fields are treated as non-persistent and non- 
> transactional by the enhancer.] Final
> fields are initialized only by the constructor, and their values  
> cannot be changed after construction
> of the instance. [Therefore, their values cannot be loaded or  
> stored by JDO; accesses are not medi-
> ated. This assertion is duplicated in chapter 18.]
> This treatment might not be what users expect; therefore, final  
> fields are not supported as persistent
> or transactional instance fields, final static fields are supported  
> by ignoring them.
>
>
> "Bummer", thought I.
>
>
> So, first of all, I'm suggesting that we at least modify 6.2 to  
> call out the exception to the rule, explicitly stating that final  
> fields are not supported.
>
> Preferably, however, I suggest we change the spec to support final  
> fields.  The statement in 22.10.2 that reads "final fields are  
> initialized only by the constructor, and their values cannot be  
> changed after construction of the instance" is actually incorrect.   
> Reflecting on a final field and calling setAccessible(true) does in  
> fact render it mutable to the caller.  This is all an  
> implementation needs to do!
>
> There's also the question of bytecode enhancement and the addition  
> of a no-arg constructor; it would be reasonable for the enhancer to  
> simply create a constructor that sets all the final fields to null;  
> it's going to write over them anyway.
>
>
> Perhaps I've missed something here, but I think the spec is just  
> incorrect on this matter, and it would serve users well to support  
> final on fields.  It was a huge disappointment for me when I first  
> found out JDO didn't allow for this, as I use final liberally to  
> ensure proper object construction.
>
>
> Thanks,
>
> - Chris Beams







[ Post a follow-up to this message ]



    Sponsored Links  




 





   All times are GMT. The time now is 09:49 AM.      Post New Thread    Post A Reply      
  Last Thread   Next Thread Next


Most Popular forums 

Forum Jump:
Rate This Thread:

Forum Rules:
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
HTML code is OFF
vB code is ON
Smilies are ON
[IMG] code is OFF
 
Medical and Health forum | Computer Games Reviews | Graphics design forum

Back To The Top
Home | Usercp | Faq | Register