> "It is a compile-time error for a record declaration to declare a record 
> component with the name |clone|, |finalize|, |getClass|, |hashCode|, 
> |notify|, |notifyAll|, |readObjectNoData|, |readResolve|, 
> |serialPersistentFields|, |serialVersionUID|, |toString|, |wait|, or 
> |writeReplace|."
> 
> Chris says that the serialization spec ignores all the serialization-related 
> methods if they appear inside a record; should we lift the restrictions?

But, I think we later decided we are not ignoring _all_ of the 
serialization-related methods — that a readResolve() method is OK.  

I think there’s a difference between these two rules — the one about component 
names clashing with serialization members, and the one about useless explicit 
serialization members.  A badly named component could _implicitly_ give rise to 
a method that serialization might call — which seems dangerous.  Whereas a 
serialization member that never gets called is less so.  So even if we are 
considering warnings for the latter category, I still think errors for this 
category is right.  

> "Every field corresponding to a record component of R must be definitely 
> assigned and moreover not definitely unassigned (16.9) at the end of the body 
> of the canonical constructor."
> 
> In the other we say:
> 
> "It is a compile-time error if at the end of the body of the compact 
> constructor, any of the fields corresponding to the record components of R 
> are neither definitely assigned nor definitely unassigned."
> 
> Moreover, a deeper question: should we leave the magic auto-initialization of 
> fields only for the compact form? That way, you would have a _new_ linguistic 
> form, with _new_ properties, whereas old forms (e.g. a constructor with 
> parameters) will have same rules as before (can have returns, must initialize 
> fields explicitly). I think that, from a pedagogical aspect, that would be 
> preferrable.

Absolutely we should leave the new behavior (magic initialization) for the new 
form.  A canonical constructor that is declared the old way should work like 
any other constructor.  No magic initialization, no special requirements (the 
DA requirements of all constructors wrt final fields are all the safety we 
need), no stricture against return (which was there to avoid making the magic 
initialization more complicated.




Reply via email to