JDK 14 RFR of JDK-8234783: Improve wording of spec of Record.equals
Jonathan Gibbons
jonathan.gibbons at oracle.com
Tue Jan 7 01:46:16 UTC 2020
Looks good to me.
-- Jon
On 01/06/2020 04:23 PM, Joe Darcy wrote:
> Hi Jon,
>
> Thanks for the comments; second take on the re-wording up at
>
> http://cr.openjdk.java.net/~darcy/8234783.1/
>
> and copied below for convenience.
>
> Cheers,
>
> -Joe
>
> --- old/src/java.base/share/classes/java/lang/Record.java 2020-01-06
> 16:18:43.505405539 -0800
> +++ new/src/java.base/share/classes/java/lang/Record.java 2020-01-06
> 16:18:43.317311546 -0800
> @@ -92,8 +92,8 @@
> public abstract class Record {
> /**
> * Indicates whether some other object is "equal to" this one.
> In addition
> - * to the general contract of {@link Object#equals(Object)},
> - * record classes must further participate in the invariant that
> when
> + * to the general contract of {@link Object#equals(Object)
> Object.equals},
> + * record classes must further obey the invariant that when
> * a record instance is "copied" by passing the result of the
> record component
> * accessor methods to the canonical constructor, as follows:
> * <pre>
> @@ -102,17 +102,37 @@
> * then it must be the case that {@code r.equals(copy)}.
> *
> * @implSpec
> - * The implicitly provided implementation returns {@code true} if
> and
> - * only if the argument is an instance of the same record type as
> this object,
> - * and each component of this record is equal to the
> corresponding component
> - * of the argument, according to {@link
> java.util.Objects#equals(Object,Object)}
> - * for components whose types are reference types, and according
> to the semantics
> - * of the {@code equals} method on the corresponding primitive
> wrapper type.
> + * The implicitly provided implementation returns {@code true} if
> + * and only if the argument is an instance of the same record type
> + * as this object, and each component of this record is equal to
> + * the corresponding component of the argument; otherwise, {@code
> + * false} is returned. Equality of a component {@code c} is
> + * determined as follows:
> + * <ul>
> + *
> + * <li> If the component is of a reference type, the component is
> + * considered equal if and only if {@link
> + * java.util.Objects#equals(Object,Object)
> + * Objects.equals(this.c(), r.c()} would return {@code true}.
> + *
> + * <li> If the component is of a primitive type, using the
> + * corresponding primitive wrapper class {@code PW} (the wrapper
> + * class {@code java.lang.Integer} for {@code int}, and so on) the
> + * component is considered equal if and only if {@code
> + * PW.valueOf(this.c()).equals(PW.valueOf(r.c()))} would return
> + * {@code true}.
> + *
> + * </ul>
> + *
> + * The implicitly provided implementation conforms to the
> + * semantics described above; the implementation may or may not
> + * accomplish this by using calls to the particular methods
> + * listed.
> *
> * @see java.util.Objects#equals(Object,Object)
> *
> * @param obj the reference object with which to compare.
> - * @return {@code true} if this object is the same as the obj
> + * @return {@code true} if this object is equal to the
> * argument; {@code false} otherwise.
> */
> @Override
>
> On 1/6/2020 1:22 PM, Jonathan Gibbons wrote:
>> I like what you're trying to do, but the wording used to introduce
>> the names `cr` and `cp` feels a bit contorted. How about using a
>> single name, c, introduced up front in this line:
>>
>>
>> + * of the argument. Equality of a component {@code c} is
>> determined as follows:
>>
>> with the rest of the text updated accordingly. Note the use of the
>> indefinite article `a component` when the name is introduced, and the
>> definite article `the component` in subsequent references.
>>
>> -- Jon
>>
>>
>> On 1/6/20 1:08 PM, Joe Darcy wrote:
>>> Hello,
>>>
>>> Please review a clarification to the specification of Record.equals:
>>>
>>> JDK-8234783: Improve wording of spec of Record.equals
>>> http://cr.openjdk.java.net/~darcy/8234783.0/
>>>
>>> Patch below.
>>>
>>> Thanks,
>>>
>>> -Joe
>>>
>>> --- old/src/java.base/share/classes/java/lang/Record.java 2020-01-06
>>> 13:00:52.179585999 -0800
>>> +++ new/src/java.base/share/classes/java/lang/Record.java 2020-01-06
>>> 13:00:51.987681999 -0800
>>> @@ -105,9 +105,21 @@
>>> * The implicitly provided implementation returns {@code true}
>>> if and
>>> * only if the argument is an instance of the same record type
>>> as this object,
>>> * and each component of this record is equal to the
>>> corresponding component
>>> - * of the argument, according to {@link
>>> java.util.Objects#equals(Object,Object)}
>>> - * for components whose types are reference types, and
>>> according to the semantics
>>> - * of the {@code equals} method on the corresponding primitive
>>> wrapper type.
>>> + * of the argument. Equality of the components is determined as
>>> follows:
>>> + * <ul>
>>> + *
>>> + * <li> If the component is of a reference type, the component
>>> {@code
>>> + * cr} is considered equal if and only if {@link
>>> + * java.util.Objects#equals(Object,Object)
>>> + * Objects.equals(this.cr(), r.cr()} would return true .
>>> + *
>>> + * <li> If the component is of a primitive type, using the
>>> + * corresponding primitive wrapper class {@code P} the component
>>> + * {@code cp} is considered equal if and only if {@code
>>> + * P.valueOf(this.cp()).equals(P.valueOf(r.cp()))} would return
>>> + * true.
>>> + *
>>> + * </ul>
>>> *
>>> * @see java.util.Objects#equals(Object,Object)
>>> *
>>>
More information about the core-libs-dev
mailing list