JDK-8223265 : Clarify operational semantics of java.util.Objects.equals()
  • Type: CSR
  • Component: core-libs
  • Sub-Component: java.util
  • Priority: P4
  • Status: Closed
  • Resolution: Approved
  • Fix Versions: 13
  • Submitted: 2019-05-02
  • Updated: 2019-05-03
  • Resolved: 2019-05-03
Related Reports
CSR :  
Description
Summary
-------

Describe operational semantics of `Objects.equals`.

Problem
-------

A buggy equals implementation on one of its arguments can cause `Objects.equals` to return unexpected results.

Solution
--------

Make the long-standing operational semantics of `Objects.equals` part of its specification.

Specification
-------------

    diff -r 7ab4310ed472 src/java.base/share/classes/java/util/Objects.java
    --- a/src/java.base/share/classes/java/util/Objects.java    Wed May 01 20:25:31 2019 -0700
    +++ b/src/java.base/share/classes/java/util/Objects.java    Thu May 02 14:41:06 2019 -0700
    @@ -62,10 +62,11 @@
          * Returns {@code true} if the arguments are equal to each other
          * and {@code false} otherwise.
          * Consequently, if both arguments are {@code null}, {@code true}
    -     * is returned and if exactly one argument is {@code null}, {@code
    -     * false} is returned.  Otherwise, equality is determined by using
    -     * the {@link Object#equals equals} method of the first
    -     * argument.
    +     * is returned.  Otherwise, if the first argument is not {@code
    +     * null}, equality is determined by calling the {@link
    +     * Object#equals equals} method of the first argument with the
    +     * second argument of this method. Otherwise, {@code false} is
    +     * returned.
          *
          * @param a an object
          * @param b an object to be compared with {@code a} for equality
    
    ...
    
        public static boolean equals(Object a, Object b) {
            return (a == b) || (a != null && a.equals(b));
        } 


Comments
Moving to Approved.
03-05-2019