次のコードがあるとします:
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
配列の代わりに使用してみませんか?