Draft JLS spec for records

Brian Goetz brian.goetz at oracle.com
Thu Sep 5 21:26:34 UTC 2019

> I don't think so. A compact constructor (or require initializer, as 
> you propose) could be not the only constructor. An instance 
> initializer is convenient because it's added to every constructor, 
> regardless of whether it's compact or not. So the new thing doesn't 
> supersede the instance initializer and I see no good reason to 
> explicitly disable it.

Vicente offered another reason why we might want to prohibit the 
instance initializer, if only out of expediency; it complicates the 
analysis of which fields are DA on all paths through the constructor 
(and therefore, do not need to be automatically initialized.)  If you 
have a record:

     record Foo(int i) {
         { this.i = 0; }

then the canonical constructor has to see that `i` is always initialized 
by the static init, and therefore should be not initialized.  Worse, if 
we have:

     record Foo(int i) {
         { if (tuesday) this.i = 0; }

then we have to issue a compilation error, since we have fields that are 
neither DA nor DU at the end of the initializer.

None of this is impossible to do, of course; it's just not clear whether 
it's worth it, given the limited utility of instance initializers in 
records (because we've already banned instance fields.)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.java.net/pipermail/amber-spec-experts/attachments/20190905/0fad2371/attachment.html>

More information about the amber-spec-experts mailing list