@EqualsAndHashcode
MyClass {
String property1;
List<NewClass> newClassList;
}
@EqualsAndHashcode
NewClass {
String abc;
String xyz;
}
如果我比較 MyClass 的兩個物件(用 @EqualsAndHashcode 注釋)是否相等,是否會檢查 newClassList 屬性的順序?
uj5u.com熱心網友回復:
通過使用@EqualsAndHashcode它將傳播到newClassList.equals(..)根據java doc使用的方法
介面串列
boolean equals(Object o) 比較指定物件與此串列是否相等。當且僅當指定物件也是一個串列時回傳 true,兩個串列具有相同的大小,并且兩個串列中所有對應的元素對都相等。(如果 (e1==null ? e2==null : e1.equals(e2)) 兩個元素 e1 和 e2 相等。)換句話說,如果兩個串列以相同的順序包含相同的元素,則它們被定義為相等. 此定義確保 equals 方法在 List 介面的不同實作中正常作業。
如果您想要一個串列不檢查訂單的自定義功能,那么您必須放棄@EqualsAndHashcode并根據您的需要提供您自己的equals方法。
您想要的功能將是一種簡單的方式
(list1 != null && list2 != null && list1.size() == list2.size() && list1.containsAll(list2) && list2.containsAll(list1) ) || (list1 == null && list2 == null)
這將導致我們使用以下 equals 方法
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
NewClass newClass = (NewClass) o;
return Objects.equals(property1, newClass.property1) &&
((newClassList != null && newClass.newClassList != null && newClassList.size() == newClass.newClassList.size() && newClassList.containsAll(newClass.newClassList) && newClass.newClassList.containsAll(newClassList) ) || (newClassList == null && list2 == null));
}
不要忘記也手動覆寫hashcode方法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/430313.html
