Dado o seguinte 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
}
Ao que parece, obviamente, que do array toString
, equals
os métodos são utilizados (em vez de métodos estáticos, Arrays::equals
, Arrays::deepEquals
ou Array::toString
).
Então, acho que o Java 14 Records ( JEP 359 ) não funciona muito bem com matrizes, os respectivos métodos precisam ser gerados com um IDE (que pelo menos no IntelliJ, por padrão, gera métodos "úteis", ou seja, eles usam os métodos estáticos in Arrays
).
Ou existe alguma outra solução?
toString()
, equals()
e hashCode()
de um registro são implementados usando uma referência dinâmica invocada. . Se apenas o equivalente da classe compilada pudesse estar mais próximo do que o método Arrays.deepToString
faz hoje em seu método privado sobrecarregado, ele pode ter sido resolvido para os casos primitivos.
Object
, pois isso também pode acontecer com as classes definidas pelo usuário. por exemplo, iguais incorretos
invokedynamic
tem absolutamente nada a ver com a seleção da semântica; indy é um puro detalhe de implementação aqui. O compilador poderia ter emitido o bytecode para fazer a mesma coisa; essa era apenas uma maneira mais eficiente e flexível de chegar lá. Foi discutido extensivamente durante o design dos registros se seria usada uma semântica de igualdade mais sutil (como igualdade profunda para matrizes), mas isso acabou causando muito mais problemas do que supostamente resolvia.
List
vez de uma matriz?