我想要一種方法來覆蓋具有循環引用的類的 equals 方法。下面是我的課程編輯:刪除了 getter 和 setter 的代碼class Person implements Serializable{ private String fullName; private Person friend; // Getters and setters @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Person other = (Person) obj; if (friend == null) { if (other.friend != null) return false; } else if (!friend.equals(other.friend)) return false; if (fullName == null) { if (other.fullName != null) return false; } else if (!fullName.equals(other.fullName)) return false; return true; }}在客戶端類中,我有以下內容:Person p1 = new Person();Person p2 = new Person();Person p3 = new Person();p1.setFullName("nkuruza");p2.setFullName("Another");p3.setFullName("nkuruza");p3.setFriend(p2);p1.setFriend(p2);p2.setFriend(p1);問題是在這種情況下調用 equals 方法,例如 p1.equals(p3) 會產生 StackOverflowException。如何在不必遇到此問題的情況下實現我的 equals 方法?我提前謝謝你。
2 回答

當年話下
TA貢獻1890條經驗 獲得超9個贊
由于p1
'sfriend
設置為p2
,并且p2
's friend
to p1
,您的equals()
方法最終在兩個Person
實例之間的無限調用循環中結束:
p1.equals(p2)
調用p2.equals(p1)
調用p1.equals(p2)
(永遠 - 或者更確切地說,直到達到 JVM 當前配置的堆棧大小限制,此時它將拋出一個StackOverflowException
)
現在的解決方案可能是直接測試朋友的獨特屬性,(fullname
是目前唯一的其他屬性):
else if(!friend.fullName.equals(other.friend.fullName)
(...確保更新代碼以保護任何可能的空值當然)

撒科打諢
TA貢獻1934條經驗 獲得超2個贊
真正的答案是根據現實對您的課程進行建模。
實際上,定義一個人的真正方面是什么?!那將是身份,例如名稱。
你的朋友組合明天可以改變,但你仍然是你!
所以,換句話說:從比較中排除朋友字段。更好的是:考慮不要將這種關系寫為該類中的字段(如果有的話,它應該是一個列表,而不是單個實例)。但如前所述,理想情況下,該信息超出了 person 類!
添加回答
舉報
0/150
提交
取消