Java:重写equals方法时堆栈溢出

Java:重写equals方法时堆栈溢出,java,Java,我有两个对象:用户和图像。用户包含图像(配置文件),图像包含用户(创建者) 我想重写方法equals,但我遇到了StackOverflow错误 用户: public class User{ private int id; private Image profilePicture; // [...] A lot of other varibales @Override public boolean equals(Object object) {

我有两个对象:用户和图像。用户包含图像(配置文件),图像包含用户(创建者)

我想重写方法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错误


我的问题是关于解决冲突的不同方法。

请记住,
所代表的确切含义取决于您的定义。对于某些类型的对象,“所有字段都是相同的值”是正确的做法

对于许多具有ID的对象,只比较这些ID是正确的做法。在您的例子中,将User.equals()定义为“如果两个用户对象的ID是dame,则它们是相等的”将解决具体问题(如果您确实更改了这一点,请记住,
hashCode()
需要更改为不使用任何
equals()
不使用的数据)


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

您在
用户
图像
类中递归调用
.equals
。尝试以不同的方式实现
.equals
方法<在
用户
类调用
中的code>.equals
图像
类调用
中的.equals
,反之亦然,这会导致
堆栈溢出
由于递归调用
.equals()
方法,您会遇到此问题

您正在从
User
调用
Image
.equals()
,然后再次从
Image
调用
用户的
.equals()
,后者再次调用
Image
.equals()
,并将继续调用,直到堆栈溢出,您得到该异常

为了解决此问题,您需要从它们中删除
.equals()


在我看来,您应该将其从两者中删除,因为在检查
图像
的相等性时,您应该检查
图像
本身的相等性,而不是
用户
,反之亦然。

您真的需要用相等方法比较图像吗?你不能比较一下用户ID吗?(对其他相等的方法有相同的注释)看起来两个相等的方法不断地互相调用,这就是为什么会出现堆栈溢出我理解为什么会出现堆栈溢出。我想知道的是处理这类问题的最佳方法:)我可以,我想我会使用id比较。但我想知道是否有其他方法。我确实理解为什么会出现错误。我想知道解决这种冲突的不同方法:)我确实考虑过方法“id==id->object==object”,但我希望这些值成为比较的一部分。使用hashcode和id可能是一个很好的解决方案。:)