2014-06-20 2 views
0

구현해야하는 예외적 인 요구 사항이 있습니다.equals 메서드는 두 개체에 대해 true를 반환합니다. 해시 메서드는 두 개체에 대해 다른 값을 반환합니다.

세트에 여러 객체를 저장해야합니다.

의 예로 들어이 간단한 클래스를 사용하자 -

class Name { 
    String first; 
    String last; 
    String middle; 
} 

내 비즈니스 규칙은 두 개의 이름 개체를 마지막으로 첫 번째 경우 동일한 것으로 간주됩니다 것을, 그리고 중간 필드는 모두 동일 또는 첫 번째와 마지막 필드는 경우 object의 1 개 (또는 양쪽 모두)는 중간 필드에 대해 null을가집니다.

내 Name 클래스의 해시 및 같음 메서드를 구현할 때 두 개체에 대해 equals가 true를 반환하지만 두 개체의 해시가 다른 값을 반환하는 사용 사례가있을 수 있습니다. 하나의 개체에 middle 값 다른 객체에는 중간 값이 null입니다).

내가 사용하는 실제 Set 구현은 HashSet이 해시 메서드를 사용하여 개체를 Set에 추가할지 여부를 결정하기 때문에 HashSet이 될 수 없습니다. 필자의 예제에서 해시 메서드는 my equals 메서드를 사용하여 name2 (first = Bruce, last = Phillips, middle = Allen) 및 name2 (first = Bruce, last = Phillips, middle = null) 두 객체에 대해 true를 반환합니다.

내 계획은 TreeSet을 사용하고 내 이름 클래스를 구현하는 것입니다. 내 TreeSet에서 Name 클래스 객체의 순서는 신경 쓰지 않지만 TreeSet을 사용하고 comparable의 compareTo 메소드를 구현하여 Name 클래스에서 equals 메소드를 사용할 수 있습니다 (객체 중 하나가 중간 필드에 null이 있는지 검사). 2 개의 객체가 동일한 경우.

내 요구 사항을 해결하기위한이 접근 방식의 단점은 무엇입니까?

도움 주셔서 감사합니다.

브루스

Javadoc과에서
+0

객체는 같은'hashCode'을 가질 수 있지만 equals''하지 않을 수 있지만, 그 반대가 될 수 없습니다. –

+0

확인 -이 요구 사항을 어떻게 구현합니까? –

+1

이름과 성을 사용하고 중간 이름을 무시하는'hashCode' 함수를 작성할 수없는 이유는 무엇입니까? – ajb

답변

0

:

(가) 클래스 객체의 메서드는 가장 비교하기 쉬운 오브젝트의 동치 관계를 구현 같다; 즉, null 이외의 참조 치 x 및 y에 대해서,이 메소드는 x 및 y가 같은 객체를 참조하고있는 경우에만 true를 돌려줍니다 (x == y는 true를가집니다).

일반적으로이 메서드를 재정의 할 때마다 hashCode 메서드를 재정의해야합니다. 즉, equals 개체가 동일한 해시 코드를 가져야한다는 hashCode 메서드에 대한 일반 계약을 유지해야합니다.

0

이러한 비즈니스 규칙에 대해 Object.equals 또는 Comparator.compare을 사용할 수 없습니다.이 두 가지 방법 모두 전이 행위가 필요하고 규칙이 전이하지 않기 때문입니다.

name1과 name2의 중간 이름이 다르지만 name3 중간 이름이없는 경우를 예로 들어 보겠습니다. 나는 네 규칙 name1 == name3과 name2 == name3을 이해하고있다. 귀하의 규칙이 전이 적이라면 name1 == name2를 의미합니다. 중간 이름이 다르므로 그렇지 않습니다.

Transitive nature of equals method

관련 문제