4

Class.getSuperclass()に問題があります。各子がその属性を他のクラスと比較した後、equalsリクエストを親に渡すクラスの階層を生成したいと思います。このアプローチでは、ObjectがisSame比較を行うため、Objectの上のレベルに達したときに、super.equalsの呼び出しを停止する必要があります。これは、私が望んでいることではありません。

私がこの階層を持っていると仮定します:

class Child extends Parent {
    ...
    public boolean equals(Object other) {
        ... compare my attributes to other, if everything matches:
        if (myImmediateSuperIsObject()) {
           return true;
        } else {
           return super.equals(other)
        }
    }
}



class Parent extends Object {
    public boolean equals(Object other) {
        ... compare my attributes to other, if everything matches:
        if (myImmediateSuperIsObject()) {
           return true;
        } else {
           return super.equals(other)
        }
    }
}

問題は、myImmediateSuperIsObject疑似呼び出しです。書き方は?Parent.equalsがChild.equalsから呼び出されると、Parent内では、this.getClass()。getSuperclass()はObjectではなく、Parentになります。これは、getSuperclass()を呼び出すときは、常にインスタンスのクラスである子から開始するためです。したがって、nullになるまでgetSuperclassを再帰的に呼び出すことで階層全体を構築できますが、equals呼び出しのチェーンでObjectのすぐ上にあるかどうかを判断するにはどうすればよいですか?

繰り返しになりますが、クラス階層を生成する必要があるため、これはすべて問題にすぎません。これを手動で記述した場合、もちろん、オブジェクトを拡張していることを認識し、super.equals()の呼び出しを停止します。

何か案が?

よろしく、ディートリッヒ

4

2 に答える 2

1

getClass().getSuperClass() を使用して、その Object.class かどうかをテストできます

例:

class Animal {
    boolean myImmediateSuperIsObject() {
        System.out.println("I am " + getClass() + " and my parent is " + getClass().getSuperclass());

        return this.getClass().getSuperclass() == Object.class;
    }
}
class Horse extends Animal {
    boolean myImmediateSuperIsObject() {
        System.out.println("I am " + getClass() + " and my parent is " + getClass().getSuperclass());

        return this.getClass().getSuperclass() == Object.class;
    }
}
new Horse().myImmediateSuperIsObject();
new Animal().myImmediateSuperIsObject();
于 2012-09-26T07:28:59.490 に答える
1

オブジェクト階層のプロパティを比較しているため、Commons Langの EqualsBuilder.reflectionEqualsの使用を検討しましたか?

于 2012-09-26T08:05:16.773 に答える