亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為具有循環引用 Java 的類實現 equals()

為具有循環引用 Java 的類實現 equals()

慕娘9325324 2022-07-27 20:08:21
我想要一種方法來覆蓋具有循環引用的類的 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 friendto p1,您的equals()方法最終在兩個Person實例之間的無限調用循環中結束:

p1.equals(p2)調用p2.equals(p1)調用p1.equals(p2)(永遠 - 或者更確切地說,直到達到 JVM 當前配置的堆棧大小限制,此時它將拋出一個StackOverflowException

現在的解決方案可能是直接測試朋友的獨特屬性,(fullname是目前唯一的其他屬性):

else if(!friend.fullName.equals(other.friend.fullName)

(...確保更新代碼以保護任何可能的空值當然)


查看完整回答
反對 回復 2022-07-27
?
撒科打諢

TA貢獻1934條經驗 獲得超2個贊

真正的答案是根據現實對您的課程進行建模。

實際上,定義一個人的真正方面是什么?!那將是身份,例如名稱。

你的朋友組合明天可以改變,但你仍然是你!

所以,換句話說:從比較中排除朋友字段。更好的是:考慮不要將這種關系寫為該類中的字段(如果有的話,它應該是一個列表,而不是單個實例)。但如前所述,理想情況下,該信息超出了 person 類!


查看完整回答
反對 回復 2022-07-27
  • 2 回答
  • 0 關注
  • 129 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號