我想要一种方法来覆盖具有循环引用的类的 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
提交
取消