I have made a further change to the online version. 

There was a missing case in 8.10.3, as it should be required that an explicitly 
declared accessor method is not static.

Gavin

gbierman$ hg diff -c 30704:012cc50cb363
diff -r 9f5a21334115 -r 012cc50cb363 
closed/src/java.se/share/specs/records-jls.md
--- a/closed/src/java.se/share/specs/records-jls.md     Thu Nov 28 14:06:43 
2019 +0000
+++ b/closed/src/java.se/share/specs/records-jls.md     Tue Dec 03 11:27:03 
2019 +0000
@@ -2433,6 +2433,8 @@
 
   - The accessor method must be declared `public`
 
+  - The accessor method must not be declared `static`
+
   - The accessor method must not have a `throws` clause
 
   - All other rules for a method in a normal class declaration must be


> On 26 Nov 2019, at 14:17, Gavin Bierman <gavin.bier...@oracle.com> wrote:
> 
> Thanks Alex; have made these changes to the online version.
> 
> Gavin
> 
>> On 26 Nov 2019, at 02:23, Alex Buckley <alex.buck...@oracle.com> wrote:
>> 
>> // Cutting amber-dev
>> 
>> On 11/25/2019 3:23 PM, Gavin Bierman wrote:
>>> http://cr.openjdk.java.net/~gbierman/jep359/jep359-20191125/specs/records-jls.html
>> 
>> The JLS draft is good. Some technical rewordings:
>> 
>> 1. 8.10.3: "and the type as the declared type" -- missing a "same"
>> 
>> 2. 8.10.3: Say "This field is annotated with the annotations, if any, that 
>> appear on the corresponding record component and whose annotation types are 
>> applicable in the field declaration context or in type contexts or both."  
>> (Later, for implicitly declared accessor methods, the phrase "whose 
>> annotation type is" should be "whose annotation types are". We do not 
>> constrain all the annotations to have the same annotation type, nor all the 
>> annotation types to be applicable in the same way. You could introduce an 
>> existential qualifier if you like -- "For each annotation A that appears on 
>> the corresponding ..." -- but I don't think it's necessary.)
>> 
>> 3. 8.10.3: "A method ***declared*** in a record type R is said to be an 
>> accessor method" -- this raises questions of "explicitly or implicitly". 
>> It's too easy to think it means "explicitly" when that's not always true. 
>> Sidestep the problem by speaking more directly: "In a record type R, an 
>> _accessor method for a record component_ is a method whose name is the same 
>> as the name of the record component, and whose formal parameter list is 
>> empty." Then some refactoring because long list items are hard to follow:
>> 
>> -----
>> For each record component appearing in the record component list:
>> 1. An implicitly declared private final field ...
>> 2. An accessor method for the record component. [THAT'S IT. DON'T RULE ON 
>> THE FORM OF EXPLICITLY DECLARED METHODS HERE. JUST MAKE SURE ALL THE METHODS 
>> EXIST:]
>> 
>>  If an accessor method for the record component is not explicitly declared, 
>> then one is implicitly declared with the following properties:
>>  - The name is the same as ...
>>  - ...
>> 
>>  It is a compile-time error if the implicitly declared accessor method is 
>> override-equivalent (8.4.2) with a non-private method of the class Object. 
>> [THIS PARAGRAPH IS TROUBLE. PLEASE MAKE AN EXPLICIT RULE IN 8.10.1 THAT 
>> SPELLS OUT IN CLEAR NORMATIVE TEXT THAT A RECORD COMPONENT MUST NOT HAVE BE 
>> CALLED CLONE, FINALIZE, ETC. RELYING ON A SUBTLE RULE IN A DIFFERENT SECTION 
>> ABOUT IMPLICITLY DECLARED STUFF IS *TOO HARD*. IT SUGGESTS THAT THE COMPILER 
>> SHOULD POSITION THE CARET FOR THE ERROR AT SOME POINT IN THE RECORD'S BODY, 
>> WHERE THE IMP.DECL. METHOD WOULD LIVE, RATHER THAN IN THE RECORD'S HEADER.]
>> 
>> [ITEM 2 ENDS HERE. NON-LIST TEXT FOLLOWS.]
>> 
>> If an accessor method for a record component is declared explicitly, then it 
>> must satisfy the following rules, or else a compile-time error occurs:
>> - The return type of the accessor method ...
>> - ...
>> 
>> [THE FOLLOWING PARAGRAPH IS DISTINCTLY SURE -- "IS NOT ANNOTATED" -- THAT AN 
>> EXPLICIT METHOD HAS NO ANNOTATIONS LIKE THE ONES ON THE RECORD COMPONENT. 
>> WHAT IF THE DEVELOPER WRITES ANNOTATIONS EXPLICITLY? PLEASE CHANGE THE 
>> PARAGRAPH TO AN INFORMATIVE NOTE WHERE YOU CAN SAY: ANNOTATIONS THAT APPEAR 
>> ON THE CORRESPONDING RECORD COMPONENTS ARE NOT CARRIED OVER TO EXPLICITLY 
>> DECLARED ACCESSOR METHODS, IN CONTRAST TO HOW IMPLICITLY DECLARED ACCESSOR 
>> METHODS ARE ANNOTATED ACCORDING TO BLAH BLAH.]
>> An explicitly declared accessor method is not annotated with any applicable 
>> annotation that appears on the corresponding record component.
>> -----
>> 
>> 4. 8.10.4: It's odd to see in "derived constructor signature" that a ctor 
>> has a name R, since 8.8 doesn't admit to a ctor having a name. That said, 
>> 8.8.2 speaks of "two constructors with override-equivalent signatures 
>> (ยง8.4.2) in a class", and the definition of override equivalent implies a 
>> name is present, so I'll set my concern aside. Just a minor rewording for 
>> flow -- push derivation of formal parameter list down one level, as it's not 
>> used by anything else (OK, one place, but I'll get to that) :
>> 
>> -----
>> To support proper ... corresponding to the record components.
>> 
>> A record type R has a derived constructor signature with the name R, with no 
>> type parameters, and with a formal parameter list that is derived from the 
>> record component list of R as follows:
>> 
>> - For each record component ...
>> -----
>> 
>> 8.10.5: Construct good things, or else people will wonder:  "At most one 
>> compact constructor declaration can be declared for a record type." + "In a 
>> record type R, the signature of a compact constructor declaration is the 
>> _derived constructor signature_ of R (8.10.4)."   Don't say in normative 
>> text that "one which is derived from the record component list of R is added 
>> implicitly" -- "added" is too imperative -- this is an opportunity to write 
>> an informative note that compares and contrasts a compact ctor with all 
>> other ctors in Java -- "Unlike ctors in records, and indeed in classes in 
>> general, no explicit formal parameter list is given for a compact ctor. The 
>> record component list provides the X from which a Y is derived."
>> 
>> Alex
> 

Reply via email to