为了账号安全,请及时绑定邮箱和手机立即绑定

为具有循环引用 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 关注
  • 112 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信