구현해야하는 예외적 인 요구 사항이 있습니다.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과에서
객체는 같은'hashCode'을 가질 수 있지만 equals''하지 않을 수 있지만, 그 반대가 될 수 없습니다. –
확인 -이 요구 사항을 어떻게 구현합니까? –
이름과 성을 사용하고 중간 이름을 무시하는'hashCode' 함수를 작성할 수없는 이유는 무엇입니까? – ajb