Dado el siguiente código:
public static void main(String[] args) {
record Foo(int[] ints){}
var ints = new int[]{1, 2};
var foo = new Foo(ints);
System.out.println(foo); // Foo[ints=[I@6433a2]
System.out.println(new Foo(new int[]{1,2}).equals(new Foo(new int[]{1,2}))); // false
System.out.println(new Foo(ints).equals(new Foo(ints))); //true
System.out.println(foo.equals(foo)); // true
}
Parece, por supuesto, de esa matriz toString
, equals
los métodos se utilizan (en lugar de los métodos estáticos,Arrays::equals
, Arrays::deepEquals
o Array::toString
).
Así que supongo que Java 14 Records ( JEP 359 ) no funcionan demasiado bien con las matrices, los métodos respectivos tienen que generarse con un IDE (que al menos en IntelliJ, por defecto genera métodos "útiles", es decir, usan los métodos estáticos en Arrays
).
¿O hay alguna otra solución?
toString()
, equals()
y los hashCode()
métodos de un registro se implementan utilizando una referencia invokedynamic. . Si solo el equivalente de la clase compilada pudiera haber estado más cerca de lo que hace el método Arrays.deepToString
en su método privado sobrecargado hoy, podría haber resuelto los casos primitivos.
Object
, ya que eso también podría suceder con las clases definidas por el usuario. por ejemplo, incorrecto es igual
invokedynamic
tiene absolutamente nada que ver con la selección de la semántica; indy es un detalle de implementación pura aquí. El compilador podría haber emitido bytecode para hacer lo mismo; esta era solo una forma más eficiente y flexible de llegar allí. Durante el diseño de los registros se discutió extensamente si utilizar una semántica de igualdad más matizada (como la igualdad profunda para matrices), pero esto causó muchos más problemas de los que supuestamente resolvió.
List
lugar de una matriz?