Cho mã sau:
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
}
Có vẻ như, rõ ràng, của mảng đó toString
, equals
các phương pháp được sử dụng (thay vì phương pháp tĩnh, Arrays::equals
, Arrays::deepEquals
hoặc Array::toString
).
Vì vậy, tôi đoán Bản ghi Java 14 ( JEP 359 ) không hoạt động tốt với các mảng, các phương thức tương ứng phải được tạo bằng IDE (ít nhất là trong IntelliJ, theo mặc định tạo ra các phương thức "hữu ích", tức là chúng sử dụng các phương thức tĩnh trong Arrays
).
Hoặc có giải pháp nào khác không?
toString()
, equals()
và hashCode()
phương pháp của một kỷ lục được thực hiện sử dụng một tài liệu tham khảo invokedynamic. . Nếu chỉ có lớp tương đương được biên dịch có thể gần với những gì phương thức Arrays.deepToString
thực hiện trong phương thức nạp chồng riêng của nó ngày nay, thì nó có thể đã giải quyết cho các trường hợp nguyên thủy.
Object
, vì điều đó cũng có thể xảy ra với các lớp do người dùng định nghĩa. ví dụ bằng không chính xác
invokedynamic
hoàn toàn không liên quan gì đến việc lựa chọn ngữ nghĩa; indy là một chi tiết thực hiện thuần túy ở đây. Trình biên dịch có thể đã phát ra mã byte để làm điều tương tự; đây chỉ là một cách hiệu quả và linh hoạt hơn để đạt được điều đó. Nó đã được thảo luận rộng rãi trong quá trình thiết kế các bản ghi xem có nên sử dụng một ngữ nghĩa bình đẳng nhiều sắc thái hơn (như bình đẳng sâu cho các mảng) hay không, nhưng điều này hóa ra gây ra nhiều vấn đề hơn so với giải quyết.
List
thay vì một mảng?