🏠 equals 는 일반 규약을 지켜 재정의하라.
equlas 메서드는 재정의하기 쉬워 보이지만 곳곳에 함정이 도사리고 있어 자칫하면 끔찍한 결과를 초래한다.
만약 다음과 같은 상황 중 하나에 해당한다면 재정의하지 않는 편이 낫다.
- 각 인스턴스가 본질적으로 고유하다.
- 인스턴스의 논리적 동치성을 검사할 필요가 없다.
- 상위 클래스에서 재정의한 equals 가 하위 클래스에도 딱 맞는다.
- 클래스가 private 이거나 package-private 이고 equals 를 호출할 일이 없다.
다음과 같은 상황에 해당되지 않고,객체 식별성이 아닌 논리적 동치성을 확인해야 한다면 equals 를 재정의할 필요가 있다.
주로 값 클래스들이 해당된다. Integer, String 처럼 객체가 같은지가 아닌 값이 같은지를 확인하고 싶을 때는 equals 를 재정의할 필요가 있다. 다만 값 클래스라 해도 값이 같은 인스턴스가 둘 이상 만들어지지 않음을 보장하는 인스턴스 통제 클래스라면 재정의하지 않아도 된다.
💊 equals 를 재정의할 때에는 반드시 일반 규약을 따라야한다.
- 반사성 : null이 아닌 모든 참조 값 x에 대해 x.equals(x)는 true이다.
- 대칭성 : null이 아닌 모든 참조 값 x,y에 대해 x.equals(y) == true 이면, y.equals(x) == true 이다.
- 추이성 : null이 아닌 모든 참조 값 x,y, z에 대해 x.equals(y) == true 이고, y.equals(z) == true 이면, x.equals(z) == true 이다.
- 일관성 : null이 아닌 모든 참조 값 x,y에 대해 x.equals(y) 를 반복해서 호출할 때마다 항상 같은 결과를 반복해야한다.
- null - 아님 : null이 아닌 모든 참조 값 x에 대해 x.equals(null) == false 이다.
'개인 공부 > 스터디' 카테고리의 다른 글
[이펙티브 자바] 제네릭 (0) | 2023.06.21 |
---|---|
[이펙티브 자바] 인터페이스의 용도 (0) | 2023.06.20 |
[이펙티브 자바] 상속보다는 컴포지션을 사용하라 (1) | 2023.06.13 |
[데이터 중심 어플리케이션 설계] 설계시 고려사항 (0) | 2023.06.05 |
[이펙티브 자바] Comparable (0) | 2023.05.30 |