2012-10-16 2 views
5

두 가지 메소드가 있습니까? 우리는 우리가 정의해야하는 이유 동일한 방법를 재정의 할 때두 종류의 equals() 메소드가 있습니까

public boolean equals(Bigram b) { 
    return b.first == first && b.second == second; 
    } 

@Override public boolean equals(Object o) { 
    if (!(o instanceof Bigram)) 
     return false; 
    Bigram b = (Bigram) o; 
    return b.first == first && b.second == second; 
} 

가, 2 개 방법과 비교 방법 누구의 매개 변수 Object 형입니다 같습니다!

답변

6

실제로 이것에 대한 좋은 이유가있다 : java.lang.Object

  • 당신의 동일
    • 당신은 슈퍼 클래스를 대체 할 equals(Object) 방법을 필요로 방법은 종종 사건을 처리하는 오버로드 equals(Bigram) 방법을 원하는 여기서 컴파일러는 컴파일 타임에 타입이 Bigram임을 증명할 수 있습니다. 이렇게하면 형식 검사/캐스팅을 방지하여 성능이 향상되고 코드에서 더 나은 형식 검사를 수행 할 수 있습니다.
    • 마지막으로, Bigram의 인스턴스가 아닌 객체와 동일성을 테스트하기 위해 equals를 특별한 방법으로 구현할 수 있습니다. 이것은주의 깊게 사용해야합니다 (Bigram 인스턴스가 Bigram과 같지 않은 것을 정말로 원하십니까?). 그러나 유효한 어플리케이션 (예 : 다른 유형의 콜렉션 오브젝트의 내용 비교)이 있습니다.

    일반적으로 그것은 하나의 방법은, 다른 호출 그래서으로 구현하는 것이 가장 좋은 방법입니다 그러나 예 :

    public boolean equals(Bigram b) { 
        return b.first == first && b.second == second; 
    } 
    
    @Override public boolean equals(Object o) { 
        if (!(o instanceof Bigram)) return false; 
        return equals((Bigram)o); 
    } 
    

    이 방법은 더 간결하고 한 번만 평등 테스트 로직을 구현해야한다는 것을 의미 (자신을 반복하지 마십시오!).

  • 2

    프레임 워크/equals() 방법 (같은 등의 목록에서 containsKey()지도에서, contains(),)를 오버라이드 (override) Object 클래스에서 equals() 아니라 오버로드 된 버전을 전화를 호출하는 API. 따라서 public boolean equals(Object obj)을 정의하려면이 필요합니다.

    관련 문제