次のコードがあるとします:
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
}
配列のことを、明らかに、そうですtoString、equals(、代わりに静的メソッドのメソッドが使用されているArrays::equals、Arrays::deepEquals またはArray::toString)。
したがって、Java 14 Records(JEP 359)は配列ではうまく機能しないと思います。それぞれのメソッドはIDEで生成する必要があります(少なくともIntelliJでは、デフォルトで「便利な」メソッドを生成します。つまり、静的メソッドを使用します)でArrays)。
または他の解決策はありますか?
toString()、equals()およびhashCode()レコードの方法が実装されinvokedynamicの基準を使用して。。同等のコンパイル済みクラスのみArrays.deepToStringが、そのメソッドがそのプライベートオーバーロードメソッドで現在行っていることにより近い可能性がある場合、プリミティブの場合は解決された可能性があります。
invokedynamicする選択は、セマンティクスの選択とはまったく関係ありません。インディはここでの純粋な実装の詳細です。コンパイラーは同じことをするためにバイトコードを出力することができます。これは、そこに到達するためのより効率的で柔軟な方法でした。レコードの設計中に、よりニュアンスの高い等価セマンティクス(配列の深い等価など)を使用するかどうかについて広範囲にわたって議論されましたが、これにより、予想以上に多くの問題が発生することが判明しました。
List配列の代わりに使用してみませんか?