我有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错误。
我的问题是关于解决混乱的不同方法。
答案 0 :(得分:1)
您在.equals
和User
课程中递归调用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
,同样适用于反之亦然。