Currently if we create a record it's fields are compared in their declaration 
order. This might be ineffective in cases when two objects have "heavy" fields 
equals to each other, but different "lightweight" fields (heavy and lightweight 
in terms of comparison) e.g. primitives, enums, nullable/non-nulls etc.

If we have declared a record like

public record MyRecord(String field1, int field2) {}

It's equals() looks like:

  public final equals(Ljava/lang/Object;)Z
   L0
    LINENUMBER 3 L0
    ALOAD 0
    ALOAD 1
    INVOKEDYNAMIC 
equals(Lcom/caspianone/openbanking/productservice/controller/MyRecord;Ljava/lang/Object;)Z
 [
      // handle kind 0x6 : INVOKESTATIC
      
java/lang/runtime/ObjectMethods.bootstrap(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/TypeDescriptor;Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/invoke/MethodHandle;)Ljava/lang/Object;
      // arguments:
      com.caspianone.openbanking.productservice.controller.MyRecord.class,
      "field1;field2",
      // handle kind 0x1 : GETFIELD
      
com/caspianone/openbanking/productservice/controller/MyRecord.field1(Ljava/lang/String;),
      // handle kind 0x1 : GETFIELD
      com/caspianone/openbanking/productservice/controller/MyRecord.field2(I)
    ]
    IRETURN
   L1
    LOCALVARIABLE this 
Lcom/caspianone/openbanking/productservice/controller/MyRecord; L0 L1 0
    LOCALVARIABLE o Ljava/lang/Object; L0 L1 1
    MAXSTACK = 2
    MAXLOCALS = 2

This can be improved by rearranging the comparison order of the fields moving 
enums and primitives upper, and collections/arrays lower.

-------------

Commit messages:
 - 8322292: Update copyright
 - 8322292: Shift arrays and Iterables down
 - Improve Record.equals()

Changes: https://git.openjdk.org/jdk/pull/17143/files
 Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=17143&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8322292
  Stats: 12 lines in 1 file changed: 9 ins; 0 del; 3 mod
  Patch: https://git.openjdk.org/jdk/pull/17143.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/17143/head:pull/17143

PR: https://git.openjdk.org/jdk/pull/17143

Reply via email to