The approach is much improved. I like that it casts a wide net for things that could be confused for a canonical ctor / accessor, and then nails down conditions for its correctness, rather than trying to do both in one go — and letting some error cases risk falling through the cracks. It also means it is easier to fine-tune the restrictions on exact type matches or accessibility or whatever. So +1.
I also like that it gives accessor a standing in the language, which will be useful later when we get to deconstruction patterns, for example. > On Nov 25, 2019, at 6:23 PM, Gavin Bierman <[email protected]> wrote: > > A further updated draft language spec for JEP 359 (Records) is available at: > > http://cr.openjdk.java.net/~gbierman/jep359/jep359-20191125/specs/records-jls.html > > along with an updated JVMS spec: > > http://cr.openjdk.java.net/~gbierman/jep359/jep359-20191125/specs/records-jvms.html > > (Thanks to Maurizio, Alex, Tagir and others for feedback.) > > Main change is around the definition of canonical constructor and accessor > methods. The text has changed quite a bit, but this is mainly at the surface. > Hopefully this new definition is easier to understand than before and removes > some corner cases (most of which were of the “which error should arise from > this program?”). > > The idea for canonical constructors is as follows (it’s very similar for > accessor methods): You are a constructor. If your signature is > override-equivalent to the constructor signature derived from the record > declaration in the obvious way, then you are considered a canonical > constructor. (This also means that there can’t be more than one canonical > constructor.) In addition, as you have been identified as a canonical > constructor, you must satisfy some additional requirements, otherwise there > is a compile-time error. These are: > The types of the formal parameters in the formal parameter list of the > canonical constructor must be identical to the declared type of the > corresponding record component. > A canonical constructor must not be generic (8.8.4). > A canonical constructor must be declared public. > A canonical constructor must not have a throws clause. > The body of a canonical constructor must not contain an explicit constructor > invocation statement (8.8.7.1). > All the other rules for a constructor in a normal class declaration must be > satisfied (8.8). > We could relax some of these rules - I know Remi would like to change the > third one :-) The first one is another candidate. I propose that we try these > ones out in the preview, and during the preview period you can send us your > experience kicking the tires with these. [One reason for this refactoring is > that should we decide to relax some of these restrictions, it is a relatively > simple change to the spec, which will make our lives easier for subsequent > JDKs.] > > Many thanks, > Gavin > > > >> On 21 Nov 2019, at 15:01, Gavin Bierman <[email protected]> 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 >> >> <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. >> >> As always - any further comments/thoughts/bugs most welcome! >> >> Gavin >> >>> On 31 Oct 2019, at 14:17, Gavin Bierman <[email protected] >>> <mailto:[email protected]>> wrote: >>> >>> An updated draft language spec for JEP 359 (Records) is available at: >>> >>> http://cr.openjdk.java.net/~gbierman/jep359/jep359-20191031/specs/records-jls.html >>> >>> <http://cr.openjdk.java.net/~gbierman/jep359/jep359-20191031/specs/records-jls.html> >>> >>> (Alongside is a draft JVM spec for this feature: >>> >>> http://cr.openjdk.java.net/~gbierman/jep359/jep359-20191031/specs/records-jvms.html >>> >>> <http://cr.openjdk.java.net/~gbierman/jep359/jep359-20191031/specs/records-jvms.html> >>> >>> ) >>> >>> As always, please email me any comments/thoughts/bugs. >>> >>> Thanks, >>> Gavin >>> >>> >>>> On 23 Aug 2019, at 22:25, Gavin Bierman <[email protected] >>>> <mailto:[email protected]>> wrote: >>>> >>>> A draft language spec for records is available at: >>>> >>>> http://cr.openjdk.java.net/~gbierman/8222777/8222777-20190823/specs/records-jls.html >>>> >>>> <http://cr.openjdk.java.net/~gbierman/8222777/8222777-20190823/specs/records-jls.html> >>>> >>>> This spec doesn’t yet discuss varargs records - to appear in the next >>>> draft. >>>> >>>> All comments welcomed! >>>> >>>> Thanks, >>>> Gavin >>> >> >
