2012-09-26 3 views
4

Class.getSuperclass()에 문제가 있습니다. 각 클래스의 속성을 다른 클래스와 비교 한 후 equals 요청을 부모에게 전달하는 클래스 계층 구조를 생성하려고합니다. 이 접근법을 사용하면 객체가 isSame 비교를 수행하고 내가 원한 것이 아니기 때문에 객체 위의 레벨에 도달했을 때 super.equals를 호출하는 것을 중지해야합니다.Super.equals 호출 체인에서 Object에 도달했는지 확인하는 방법은 무엇입니까?

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()를 호출 할 때 항상 인스턴스 인 클래스 인 Child에서 시작하기 때문입니다. 그래서 null을 얻을 때까지 재귀 적으로 getSuperclass를 호출하여 전체 계층 구조를 만들 수 있습니다. 그러나 Object를 호출하는 체인에서 Object 이상인지 어떻게 확인할 수 있습니까?

다시 말해서 클래스 계층을 생성해야하기 때문에 모든 문제가 있습니다. 이것을 수동으로 작성한다면 객체를 확장하고 super.equals()를 호출하는 것을 중지한다는 것을 알 수 있습니다.

아이디어가 있으십니까?

안부, 디트리히

+2

계층 구조 트리의 루트로 정의하는'Object'와'Parent' 사이에 하나의 추상 클래스를 도입하는 것은 어떻습니까? 그 클래스에서, 당신은 더 이상 아무것도하지 않기 위해'equals'를 override 할 수 있습니다. –

+2

Parent 클래스는 Object를 확장합니다. 수퍼 클래스가 Object인지 테스트 할 필요가 없습니다. 그것은, 그리고 그것은 바꿀 수 없습니다. 그래서 자식이'super.equals()'를 호출하게하십시오. –

+0

"Object는 isSame 비교를 수행하며 원하는 것은 아닙니다." 이 일을하는 것이 어떤 차이를 만들지 아니면 단지 학문적 인 질문이 될 수있는 예를 제시 할 수 있습니까? –

답변

1

을 비교하고 있기 때문에 속성 개체 계층 구조에서 EqualsBuilder.reflectionEqualsCommons Lang에서 생각해 보셨습니까?

+0

우수 해결 방법! 그러나 호출 계층 구조에서 _super_가 현재 호출 수준에있는 정확한 유형을 알아낼 수는 없습니까? – dschulten

+0

Object보다 먼저 중지 할 필요가 없습니다. Object 속성이 비교되지 않습니다. –

+0

모든 것이 일치하면 Object.equals가 불려 가면 (자), 일반적으로 같지 않은 인스턴스를 비교합니다. 따라서, 모든 property가 일치해도 equals는 false가됩니다. 내가 의미하는 바를 더 잘 표현합니까? – dschulten

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(); 
+0

답장을 보내 주셔서 감사합니다. 불행히도 equals가 자식에서 호출되고 부모에있을 때 작동하지 않습니다. 나는 그것을 더 분명하게하기 위해 질문을 편집했다. – dschulten

관련 문제