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

Misleading documentation of Objects.equals

XMLWordPrintable

      FULL PRODUCT VERSION :
      sun-jdk-1.8.0_51

      ADDITIONAL OS VERSION INFORMATION :
      Not relevant

      A DESCRIPTION OF THE PROBLEM :
      The documentation of Objects.equals states:

      """
      Returns true if the arguments are equal to each other and false otherwise. Consequently, if both arguments are null, true is returned and if exactly one argument is null, false is returned. Otherwise, equality is determined by using the equals method of the first argument.
      """

      However, it is possible to construct a pathological case which violates this: a class which overrides equals(Object) to return false will return "true" for Objects.equals(a, a), despite a.equals(a) being false.

      If a is non-null, then the documentation suggests that you will hit the "Otherwise" case, meaning that a.equals(a) will be invoked, so it should be false. However, it is caught by the "a == a" in the conditional expression, so true is returned.

      The documentation should be clarified to reflect this. For example:

      """
      if both arguments are null **or refer to the same instance**, true is returned
      """

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      https://ideone.com/f2qBhR

      import java.util.Objects;

      class Ideone
      {
      @Override public boolean equals(Object other) {
      return false;
      }

      public static void main (String[] args) throws java.lang.Exception
      {
      Ideone i = new Ideone();
      System.out.println(i == null);
      System.out.println(i.equals(i));
      System.out.println(Objects.equals(i, i));
      }
      }

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      false
      false
      false
      ACTUAL -
      false
      false
      true

      REPRODUCIBILITY :
      This bug can be reproduced always.

      ---------- BEGIN SOURCE ----------
      https://ideone.com/f2qBhR

      import java.util.Objects;

      class Ideone
      {
      @Override public boolean equals(Object other) {
      return false;
      }

      public static void main (String[] args) throws java.lang.Exception
      {
      Ideone i = new Ideone();
      System.out.println(i == null);
      System.out.println(i.equals(i));
      System.out.println(Objects.equals(i, i));
      }
      }
      ---------- END SOURCE ----------

            smarks Stuart Marks
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

              Created:
              Updated:
              Resolved: