覆盖自我引用父子对象的等于

时间:2016-05-29 16:05:02

标签: java recursion equals

我有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

我有一种感觉,我错过了一些非常明显的东西。 提前谢谢。

2 个答案:

答案 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()定义的第一行将阻止无限递归。