Language
record: 配列の構成要素は値ではなく参照で比較される
recordが生成するequalsでも、配列要素は内容ではなく配列オブジェクトの参照として比較されます。
SourceArrayRecords.java
Java 21
package examples.record;
public final class ArrayRecords {
private ArrayRecords() {}
public record Bytes(byte[] value) {}
}TestArrayRecordsTest.java
Java 21
package examples.record;
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import org.junit.jupiter.api.Test;
class ArrayRecordsTest {
@Test
void 同じ要素の別配列を持つrecordはequalsで等しくならない() {
var first = new ArrayRecords.Bytes(new byte[] {1, 2});
var second = new ArrayRecords.Bytes(new byte[] {1, 2});
assertNotEquals(first, second);
assertArrayEquals(first.value(), second.value());
}
}01Assertion
このテストで確認できること
- 同じ内容の別byte配列を持つrecordはequalsでfalseになる
- 配列要素はassertArrayEqualsで等しいことを確認できる
配列を構成要素に含むrecordでは、防御的コピーとArrays.equalsに基づく独自の比較を検討します。
OBSERVED RESULT
expected: record.equals → false
actual: false
expected: array contents equal → true
actual: true