Java:StackOverflow同时覆盖equals方法

时间:2016-11-15 12:56:06

标签: java

我有2个对象:User&图片。用户包含图像(配置文件),图像包含用户(创建者)。

我想覆盖方法equals但是我遇到了StackOverflow错误。

用户:

public class User{

    private int id;
    private Image profilePicture;

    // [...] A lot of other varibales

    @Override
    public boolean equals(Object object) {

        User user = null;

        if (object instanceof User)
            user = (User) object;
        else
            return false;

        return (   id == user.getId()
                && profilePicture.equals(user.getProfilePicture())
                // [...] testing others variables
                );
    }

图片:

public class Image{

    private int id;
    private User creator;

    // [...] A lot of other varibales

    @Override
    public boolean equals(Object object) {

        Image image = null;

        if (object instanceof Image)
            image = (Image) object;
        else
            return false;


        return (id == image.getId()
                && creator.equals(image.getCreator())
                // [...] A lot of other varibales
               );
    }
}

解决这类问题的最佳方法是什么?感谢

修改

我明白为什么我会收到stackoverflow错误

我的问题是关于解决混乱的不同方法。

3 个答案:

答案 0 :(得分:1)

您在.equalsUser课程中递归调用Image。尝试以不同的方式实现.equals方法。 .equals班级中的User会在.equals班级中调用Image,反之亦然,会产生stackoverflow

答案 1 :(得分:0)

请注意,equals所代表的内容由您来定义。对于某些类型的对象,“所有字段都是相同的值”是正确的事情。

对于许多具有ID的对象,仅比较这些ID是正确的做法。在您的情况下,将User.equals()定义为“两个用户对象是相同的,如果它们的ID是贵妇人”将解决具体问题(如果您确实更改了,请记住hashCode()需要更改为不使用equals()不使用的任何数据。

这是否适合您使用equals()的具体方式是一个单独的问题,无法用您提供的数据来回答。

答案 2 :(得分:0)

由于.equals()方法的递归调用,您遇到此问题。

您从.equals()再次呼叫Image的{​​{1}}再次User来自.equals()的用户Image再次呼叫.equals() Image 1}}并将继续调用,直到堆栈溢出并且你得到该异常。

要解决此问题,您需要从其中任何一个中删除.equals()

在我看来,你应该从两者中删除它,因为在检查Image的相等性时,你应该检查Image本身的平等,而不是User,同样适用于反之亦然。