다음 코드가 주어진다 :
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 레코드 ( JEP 359 )가 배열에서 너무 잘 작동하지 않는다고 생각합니다. 각 메소드는 IDE를 사용하여 생성해야합니다 (적어도 IntelliJ에서는 기본적으로 "유용한"메서드를 생성합니다. 즉 정적 메소드를 사용합니다) 에서 Arrays
).
아니면 다른 해결책이 있습니까?
toString()
, equals()
및 hashCode()
기록 방법이 구현 invokedynamic 참조를 사용. . 컴파일 된 클래스에 해당하는 클래스 만 Arrays.deepToString
오늘날 개인 오버로드 된 메소드에서 메소드 가 수행하는 작업에 더 근접 할 수 있었다면 원시 사례에 대해 해결 되었을 수 있습니다.
invokedynamic
하는 선택은 의미론의 선택과 전혀 관련이 없습니다. indy는 순수한 구현 세부 사항입니다. 컴파일러는 동일한 작업을 수행하기 위해 바이트 코드를 생성했을 수 있습니다. 이것은 더 효율적이고 유연한 방법이었습니다. 레코드를 디자인하는 동안 더 뉘앙스 드 평등 시맨틱 (예 : 배열에 대한 깊은 평등)을 사용할지 여부에 대해 광범위하게 논의되었지만, 이것은 해결 된 것보다 더 많은 문제를 일으키는 것으로 나타났습니다.
List
배열 대신 사용 하는 것은 어떻습니까?