2009-10-11 3 views
12

자신의 클래스를 작성할 때 항상 equals(Object o)을 재정의해야합니까?항상 equals를 재정의해야합니까?

그렇지 않으면 자동으로 모든 입력란이 같은지 확인하나요? 또는 두 변수가 동일한 객체를 가리키는 지 확인합니다.

답변

16

개체를 어떤 식 으로든 비교할 클래스를 작성하는 경우 equalshashCode 메서드를 재정의해야합니다. 슈퍼 클래스에서 equals 메소드의 동작을 상속 될 것이며, Object 클래스 인 슈퍼 클래스의 경우, 다음이의 Java API 사양에 setforth 행동 할 것이다 명시 적 equals 방법을 제공

하지 않음 Object 클래스입니다.

equals 방법을 제공하는 일반적인 규칙은 Object 클래스 문서에서 찾을 수있다

, 즉, equalshashCode 방법 설명서.

4

Object 클래스의 equals 메소드는 객체에서 가능한 가장 동등한 관계를 구현합니다. 즉, null 이외의 참조 치 x 및 y에 대해서,이 메소드는 x 및 y가 같은 객체를 참조하고있는 경우에만 true를 돌려줍니다 (x == y는 true를가집니다).

두 객체가 같은 정보를 포함하고 있는지 (동일한 정보가 포함되어 있는지) 테스트하려면 equals() 메소드를 재정의해야합니다. 아이디 연산자가 자신에게 적합하지 않은 경우 항상 equals() 메소드를 대체해야합니다. 수업.

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

5

의미가있는 경우에만 equals()을 재정의하십시오. 그러나 분명히 equals()을 무시하면 hashcode() 계약이 깨지지 않아야합니다. 즉, 두 객체가 동일하면 동일한 해시 코드를 가져야합니다.

언제 이해할 수 있습니까? Object.equals()이 부족한 경우. Integer(10) 다른 Intger(10) 같아야하기 때문에 말이 때

번호 명백한 예이다 :이 방법은 기본적으로 두 개체이므로 같은 객체 의미 기준 신원 내린다.

또 다른 예는 데이터베이스 레코드를 나타내는 경우 일 수 있습니다. 고유 한 정수 ID를 가진 학생 기록이 있다면 은 단순히 ID 필드를 비교하기에 충분한 equals를 구현해야합니다.

2

IDE에 의존해서는 안되지만, Eclipse는 alt + shift + s를 누르고 equals 및 hashCode 메뉴 옵션을 선택하여이 기능을 제공합니다. toString 옵션도 있습니다. Josh Bloch의 Effective Java에는이 주제에 대한 좋은 정보가 있습니다. 링크를 클릭하면이 주제를 다루는 Google 도서에서 호스팅되는 장으로 이동합니다.