Java:重写equals方法时堆栈溢出
我有两个对象:用户和图像。用户包含图像(配置文件),图像包含用户(创建者) 我想重写方法equals,但我遇到了StackOverflow错误 用户: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) {
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可能是一个很好的解决方案。:)