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

remove equals and hashCode implementations from j.l.i.VarHandle

XMLWordPrintable

    • Icon: CSR CSR
    • Resolution: Approved
    • Icon: P3 P3
    • 12
    • core-libs
    • None
    • behavioral
    • minimal
    • The equals and hashCode implementations in VarHandle were just introduced in 12 there shouldn't be any client code depending on it
    • Java API
    • SE

      Summary

      Remove the implementations of methods VarHandle::equals and VarHandle::hashCode, added in 12, in order to make j.l.i.VarHandle implementation consistent with j.l.i.MethodHandle.

      Problem

      It is not possible to make sure that two VarHandles with the same content are equal, so we prefer to make no assumptions and don't override the default implementation at j.l.Object. These methods were erroneously added in 12 and should be backed out before 12 ships.

      Solution

      Remove the implementations provided as part of JEP-334 [1]

      Specification

      diff -r 9b0d6ecd8e45 -r 26cf6ea754d2 src/java.base/share/classes/java/lang/invoke/VarHandle.java
       --- a/src/java.base/share/classes/java/lang/invoke/VarHandle.java  Wed Dec 19 14:02:19 2018 -0500
      +++ b/src/java.base/share/classes/java/lang/invoke/VarHandle.java   Wed Dec 19 14:28:06 2018 -0500
      @@ -1865,35 +1865,6 @@
           }
      
           /**
      -     * Compare this {@linkplain VarHandle} with another object for equality.
      -     * Two {@linkplain VarHandle}s are considered equal if they both describe the
      -     * same instance field, both describe the same static field, both describe
      -     * array elements for arrays with the same component type, or both describe
      -     * the same component of an off-heap structure.
      -     *
      -     * @param o the other object
      -     * @return Whether this {@linkplain VarHandle} is equal to the other object
      -     */
      -    @Override
      -    public final boolean equals(Object o) {
      -        if (this == o) return true;
      -        if (o == null || getClass() != o.getClass()) return false;
      -
      -        VarHandle that = (VarHandle) o;
      -        return accessModeType(AccessMode.GET).equals(that.accessModeType(AccessMode.GET)) &&
      -               internalEquals(that);
      -    }
      -
      -    abstract boolean internalEquals(VarHandle vh);
      -
      -    @Override
      -    public final int hashCode() {
      -        return 31 * accessModeType(AccessMode.GET).hashCode() + internalHashCode();
      -    }
      -
      -    abstract int internalHashCode();
      -
      -    /**
            * Returns a compact textual description of this {@linkplain VarHandle},
            * including the type of variable described, and a description of its coordinates.
            *

      References

            vromero Vicente Arturo Romero Zaldivar
            vromero Vicente Arturo Romero Zaldivar
            Mandy Chung (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated:
              Resolved: