为具有循环引用 Java 的类实现 equals()

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


我提前谢谢你。


慕娘9325324
浏览 113回答 2
2回答

当年话下

由于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)(...确保更新代码以保护任何可能的空值当然)

撒科打诨

真正的答案是根据现实对您的课程进行建模。实际上,定义一个人的真正方面是什么?!那将是身份,例如名称。你的朋友组合明天可以改变,但你仍然是你!所以,换句话说:从比较中排除朋友字段。更好的是:考虑不要将这种关系写为该类中的字段(如果有的话,它应该是一个列表,而不是单个实例)。但如前所述,理想情况下,该信息超出了 person 类!
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java