2015-01-29 3 views
2

나는 복잡한 객체를 가지고 있으며 동등한 경우에만 특정 속성 만 검사하려고하며, 그렇다면 비교 된 객체를 동일하게 간주해야합니다.복잡한 개체에 대한 사용자 지정 동일성 검사 방법?

비교 중에 일부 필드를 생략하려는 경우가 있으므로 기본 equal() 메서드를 재정의하고 싶지 않습니다.

public class ComplexObject { 
    private ObjectA a; 
    //... 
    prrivate ObjectN n; 
} 

public class ObjectA { 
    private String name; 
    private int age; 
} 

지금 모든 개체에 대해 내가 Comparator의 일종이 필요 것 (다만 java.util.Comparator하지 equalness을 확인하기 위해, 순서에 사용되는 클래스이다).

boolean compare(ObjectA a1, ObjectA a2) { 
    return a1.getName().equals(a2.getName()); //age intentionally left out, just showcase 
} 

그리고 내가 함께 체인에 모든 "비교기"가 하나 개의 비교기는 false을 반환하는 경우 깨고, 다른 후 하나를 확인할 것입니다. 결국 복잡한 객체 두 개를 비교하기 위해 boolean ComplexComparator.compare(complexO1, complexO2)을 호출하면 비교 체인이 포함 된 모든 멤버 객체의 유효성을 검사합니다.

아마 이미 사용자 정의 등가 비교 (구아바, 아파치, 스프링) 요구 사항에 기본 기능을 제공하는 적절한 클래스가 있습니까? 아니면 모든 것을 직접 구현해야합니까?

+0

나는 *입니다) (등호를 위해 *이 정의를 가지고 생각하지 않는다 좋은 아이디어. – TheLostMind

+0

왜 '평등'을 사용할 수 없습니까? 나는 그것을 얻지 못했다. –

+0

원하는대로 호출하십시오. ... – membersound

답변

3

음, 그런 일을 할 수있는 나는 적어도 두 개의 라이브러리를 알고 사용 가능한 더 쉽게 두 개체의 평등을 결정하는 비교 기능을 구현하는 라이브러리 ...

이있는 경우 귀하의 질문이기 때문이다.

한 손으로 당신은 아파치 코 몬즈 랭 EqualsBuilder

public boolean equals(Object obj) { 
    if (obj == null) { return false; } 
    if (obj == this) { return true; } 
    if (obj.getClass() != getClass()) { 
    return false; 
    } 
    MyClass rhs = (MyClass) obj; 
    return new EqualsBuilder() 
       .appendSuper(super.equals(obj)) 
       .append(field1, rhs.field1) 
       .append(field2, rhs.field2) 
       .append(field3, rhs.field3) 
       .isEquals(); 
    } 

를 사용할 수 있습니다 또는 당신은 구글 구아바를 사용할 수 ComparisonChain

public int compareTo(Foo that) { 
    return ComparisonChain.start() 
     .compare(this.aString, that.aString) 
     .compare(this.anInt, that.anInt) 
     .compare(this.anEnum, that.anEnum, Ordering.natural().nullsLast()) 
     .result(); 
    } 
+0

I * think * OP의 문제는 'equals'가 아닌 사용자 정의 동등 확인을 사용하여 각 필드를 비교하려고한다는 것입니다. 나는 EqualsBuilder가 비교가'equals' no를 사용한다고 가정한다. – sprinter

+0

감사합니다. 'ComparisonChain'은 오브젝트가 동일한 지 확인하기 위해 세 번째 인수로'Comparator '를 사용할 수 있기 때문에 좋습니다. 따라서, 'Comparator'조차도 콜렉션 순서화에 보통 사용됩니다. – membersound

+0

@sprinter 어떻게 생각합니까? –

관련 문제