2015-01-25 5 views
0

동일한 클래스의 인스턴스가 2 개 있습니다.Object.equals (Object) 메서드를 재정의해야합니까?

public class Gilda { 
    private String nome; 
    public Gilda(String nome) { 
     this.nome = nome; 
    } 
    // More stuff 
} 

Object.equals(Object) 방법을 통해이를 비교하기 위해 노력하고, 그것은 false를 반환합니다. nome은이 두 인스턴스에서 동일한 값을 가지기 때문에 이상합니다.

비교는 어떻게 이루어 집니까? 이것은 예상 된 행동입니까? 해당 메서드를 재정의해야합니까?

+0

참조 또는 값으로 비교할 것인지 여부에 따라 다릅니다. – SLaks

답변

5

예, 무시해야합니다. 그렇게하지 않으면 Object 자체가 제공하는 버전을 사용하고 있습니다.이 버전은 기본적으로 참조 평등을 기본으로합니다 (동일한 "실제"개체 임).

IDE에 따라 자동으로 작성 될 수 있습니다. 예를 들어, 인 IntelliJ (14)는 나를 위해 쓴 :

@Override 
public int hashCode() { 
    return nome != null ? nome.hashCode() : 0; 
} 
+0

왜 우리는'Object.equals (Object)'메소드의'Gilda' 인스턴스로 형변환하지만'Object.hashCode() '에'nome' 변수를 사용합니까? –

+0

'equals'와 함께 Gilda (this)를 어떤 종류의 다른 종류의 객체와 비교하기 때문에. 그러나,'hashCode'에서 "나에게이 정확한 객체의 해시 코드를 알려줘"라고 말하고있다. 그리고 그 객체에 대한 유일한 면인 'nome'이 있기 때문에, 우리는'nome'으로 표현 된'String'에 작업을 위임하고 있습니다. – Todd

+0

다른 변수 나 메소드가 있으면 어떻게됩니까? –

0

당신은 오버라이드 (override) 할 필요가 있습니다 :

@Override 
public boolean equals(Object o) { 
    if (this == o) return true; 
    if (o == null || getClass() != o.getClass()) return false; 

    Gilda gilda = (Gilda) o; 
    if (nome != null ? !nome.equals(gilda.nome) : gilda.nome != null) return false; 

    return true; 
}   

그리고 물론

는 항상 equals과 동시에 수행해야 hashCode을 잊지 마세요 equals 메서드 - 따라서 그에 따라 hashCode를 재정의해야합니다.