Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8257619

Clarify what component values are used in Record::equals

    XMLWordPrintable

Details

    • CSR
    • Resolution: Approved
    • P3
    • 16
    • core-libs
    • None
    • behavioral
    • minimal
    • Java API
    • SE

    Description

      Summary

      The specification for java.lang.Record::equals, in particular its implSpec section, should be updated in order to sync it with the current default implementation provided at java.lang.runtime.ObjectMethods.

      Problem

      There are two issues in the current specification for java.lang.Record::equals:

      • It states that the values used in the comparison are the ones returned by the component accessors, while the implementation uses the values of the component fields
      • The equality of primitives states that the implementation should use the valueOf method of the corresponding boxed type along with Object::equals which is not what the implementation is actually doing

      Solution

      Update the specification for method java.lang.Record::equals in particular:

      • Clarify that the values used in the comparison are the ones of the component field
      • Clarify that the equality of primitives should use the compare method at the corresponding boxed type

      Specification

      diff --git a/src/java.base/share/classes/java/lang/Record.java b/src/java.base/share/classes/java/lang/Record.java
      index 121fc7ce73c..ac41c375a70 100644
      --- a/src/java.base/share/classes/java/lang/Record.java
      +++ b/src/java.base/share/classes/java/lang/Record.java
      @@ -109,15 +109,14 @@ public abstract class Record {
            * <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}.
      +     * 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
            * corresponding wrapper class for {@code int} is {@code
            * java.lang.Integer}, 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}.
      +     * PW.compare(this.c, r.c)} would return {@code 0}.
            *
            * </ul>
            *

      Attachments

        Issue Links

          Activity

            People

              vromero Vicente Arturo Romero Zaldivar
              chegar Chris Hegarty
              Chris Hegarty
              Votes:
              0 Vote for this issue
              Watchers:
              1 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: