我有Class
使用自引用
public class MyObject {
private String name;
private List<MyObject> childrens;
private MyObject parent;
@Override
public int hashCode() {
int hash = 5;
hash = 13 * hash + Objects.hashCode(this.name);
hash = 13 * hash + Objects.hashCode(this.childrens);
hash = 13 * hash + Objects.hashCode(this.parent);
return hash;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final MyObject other = (MyObject) obj;
if(!this.name.equalsIgnoreCase(other.name))
return false;
if(this.parent==null)
{
if(other.parent!=null)
{
return false;
}
}else if(!this.parent.equals(other.parent))
{
return false;
}
if(!allChildrenEqual(this,other))
{
return false;
}
return true;
}
private boolean allChildrenEqual(MyObject aThis, MyObject other) {
List<MyObject> children1=aThis.getChildrens();
List<MyObject> children2=other.getChildrens();
//Avoid infinite recusion can't use anything simple as
// list1 equals other list
return true;
}
我想知道如何正确覆盖equals,比较这些对象的层次结构,而不会进入无限递归并导致StackOverflowError。
我有一种感觉,我错过了一些非常明显的东西。 提前谢谢。
答案 0 :(得分:1)
创建$(document).scroll(function() {
if($(window).scrollTop() > 50){
$("#headerline").css("background","red");
$("#header").hide();
$("#header2").show();
}else if($(window).scrollTop() < 50){
$("#headerline").css("background","blue");
$("#header2").hide();
$("#header").show();
}
});
方法,然后在equalsNoParentCheck()
方法中使用该方法,并将allChildrenEqual()
方法更改为使用equals()
并执行父检查。
此外,equalsNoParentCheck()
方法中存在相同的递归问题。只需从哈希码算法中删除父项。 Hashcodes不 是唯一的,只需尽力而为。无论如何,包括家长在内的总体上不太可能产生很大的不同。
由于您正在使用hashCode()
,因此您也可以使用Objects.hashCode()
:
Objects.hash()
答案 1 :(得分:0)
我认为只是提出递归等价测试&#34;的基本情况,即
if (object == this)
return true;
在equals()定义的第一行将阻止无限递归。