2012-08-06 1 views
2

What issues should be considered when overriding equals and hashCode in Java? 포스트에서 getClass를 사용하여 Java에서 적절한 평등 방법을 작성하는 방법에 대해 자세히 설명합니다.이 메소드는 우리가 동일시하는 두 객체의 RUntime 유형을 비교합니다. 나는 우리가 이렇게하는 이유는 B가 A를 확장한다면 a.equals (b) = b.equals (a) (반사성)을 원한다는 것을 이해하는 것이다.자바에서 getClass() 접근법을 오버라이드

제 생각에는 큰 한계가 있습니다. 오브젝트 A의 콜렉션을 가지고 있다면 A의 서브 클래스 인 B 오브젝트 몇 개를 삽입하면 a.equals (b)는 항상 거짓입니다 ... 아마도 특정 시간에 이전 instanceof 연산자를 사용하여 다형성과 하위 유형의 동등성을 허용합니까? 당신의 생각은 무엇입니까?

+0

... 예. 당신이 말하는 것은 분명히 사실입니다. 뭐가 문제 야? –

+0

나는 특별한 문제가 없다. 나는 한 가지 관행이 언제나 선호 될지 그리고 내가 중요한 점을 놓쳤는 지 궁금해했다. – Bober02

답변

4

.equals()이 인터페이스에 대해서만 신경을 쓰는 예제를 보려면 java.util까지만 봐야합니다. 예를 들어, java.util.List은 관련 특성 등식이 정의되고 해시 코드를 계산하기위한 공식이 명시 적으로 문서화됩니다.

질문에 대답하기 위해 특정 유형의 하위 유형을 무시하는 것이 좋습니다. 하지만 인터페이스를 동등한 측면으로 만듦으로써 Josh Bloch의 접근 방식을 좋아합니다.

1

반드시 그런 것은 아닙니다. 예를 들어, JDK의 콜렉션을 보면 덜 엄격한 정의를 사용합니다. 아래 코드는 "true"를 두 번 출력합니다. 결국 그것은 계약 및 문서화의 문제입니다.

equals contract in List (강조 광산) :

는리스트와 동일한 지 어떤지 지정된 객체를 비교합니다. 지정된 오브젝트가리스트이며, 양쪽리스트가 같은 사이즈로, 2 개의리스트 내의 대응하는 모든 요소의 페어가 동일한 경우에만, true를 돌려줍니다. (e1 == null? e2 == null : e1.equals (e2)).) 2 개의 요소가 같은 순서로 같은 요소를 포함하고있는 경우, 2 개의 요소가 동일한 것으로 정의됩니다 . 이 정의에 의해, equals 메소드는, List 인터페이스의 여러 구현간에 올바르게 기능합니다. 그만큼 재귀 요구 사항을 위반하지 않는

모든List 존중 계약을 구현하는 클래스로.

public static void main(String[] args) { 
    List<String> list1 = new ArrayList<String>(); 
    list1.add("a"); 

    List<String> list2 = new LinkedList<String>(); 
    list2.add("a"); 

    List<String> list3 = Arrays.asList("a"); 

    System.out.println("arraylist = linkedlist? " + list1.equals(list2)); 
    System.out.println("arraylist = Arrays.aslit? " + list1.equals(list3)); 
}