Updated Draft specs for JEP 359 (Records)

Alex Buckley alex.buckley at oracle.com
Thu Nov 21 20:24:29 UTC 2019


On 11/21/2019 7:01 AM, Gavin Bierman wrote:
> A hopefully final draft language spec for JEP 359 (Records) is available at:
> 
> http://cr.openjdk.java.net/~gbierman/jep359/jep359-20191121/specs/records-jls.html
> 
> This incorporates (I hope!) all the very helpful suggestions from everyone on these lists - many thanks.

1. 8.10.1 says "As a record component corresponds to an accessor method, 
restrictions on accessor methods (8.10.3) mean that it is always a 
compile-time error for a record header to declare a record component 
with the name finalize, getClass, hashCode, notify, notifyAll, or 
toString." -- `record Foo(int wait){}` is also in error because 8.10.3 
will see that the imp.decl. accessor method `int wait()` is 
override-equivalent with the non-private method `void wait()` in Object. 
Similarly for `record Bar(Object clone){}`. `equals` is a different 
story, and that's a surprise, so explain it -- show `record Quux(boolean 
equals){}` as legal because the accessor method is `public boolean 
equals()` which merely (albeit rather confusingly) overloads the 
inherited `public boolean equals(Object)` method. The relationship 
between each of Object's methods and the implicit record components 
should be spelled out explicitly in the note.

2. 8.10.3: Technical rewording: from "The implicitly declared accessor 
method is annotated with the annotation that appears on the 
corresponding record component, if this annotation type is applicable to 
a method declaration or type context." to "The implicitly declared 
accessor method is annotated with the annotations, if any, that appear 
on the corresponding record component and whose annotation types are 
applicable in the method declaration context or in type contexts or 
both. Note: This means that an annotation on a record component may not 
necessarily be carried over to the corresponding implicitly declared 
accessor method."

3. 8.10.4: A canonical ctor is defined as a public ctor, and then 
there's an error if an explicit canonical ctor is not public. That error 
will never occur because a canonical ctor is always public. This was the 
discussion on November 4, which doesn't seem to have been considered. I 
think "It is a compile-time error if a record declaration contains more 
than one explicit declaration of the canonical constructor." is the 
catch-all solution, but then the JLS must explain in a note why THE 
canonical ctor can have multiple declarations.

4. 8.10.4: Technical rewording: from "The canonical constructor must not 
declare type variables." to "The canonical constructor must not be 
generic (8.8.4)."

I assume the November JVMS draft at 
http://cr.openjdk.java.net/~gbierman/jep359/jep359-20191121/specs/records-jvms.html 
is still being updated?

Alex


More information about the amber-spec-experts mailing list