Diberikan kode berikut:
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
}
Tampaknya, jelas bahwa array toString
, equals
metode digunakan (bukan metode statis Arrays::equals
,, Arrays::deepEquals
atau Array::toString
).
Jadi saya kira Java 14 Records ( JEP 359 ) tidak berfungsi dengan baik dengan array, metode masing-masing harus dihasilkan dengan IDE (yang setidaknya di IntelliJ, secara default menghasilkan metode "berguna", yaitu mereka menggunakan metode statis dalam Arrays
).
Atau adakah solusi lain?
toString()
, equals()
dan hashCode()
metode rekor diimplementasikan menggunakan referensi invokedynamic. . Jika hanya kelas yang dikompilasi setara bisa lebih dekat dengan apa yang dilakukan metode Arrays.deepToString
ini dalam metode kelebihan beban pribadinya hari ini, itu mungkin telah dipecahkan untuk kasus primitif.
Object
, karena itu bisa terjadi dengan kelas yang ditentukan pengguna juga. mis salah sama dengan
invokedynamic
sama sekali tidak ada hubungannya dengan pemilihan semantik; indy adalah detail implementasi murni di sini. Kompilator dapat memancarkan bytecode untuk melakukan hal yang sama; ini hanya cara yang lebih efisien dan fleksibel untuk sampai ke sana. Itu dibahas secara luas selama desain catatan apakah akan menggunakan semantik kesetaraan yang lebih bernuansa (seperti kesetaraan yang mendalam untuk array), tetapi ini ternyata menyebabkan jauh lebih banyak masalah daripada yang seharusnya dipecahkan.
List
bukan array?