1. 반사성: x.equals(x)는 true
2. 대칭성: x.equals(y) 의 결과는 y.equals(x)와 같아야한다.
3. 추이성: x.equals(y)가 true이고 y.equals(z)가 true이면 x.equals(z)도 true
4. 일관성: 한번 true면 계속 true여야한다.
5. null이 아님: null이 아닌 x에 대해 x.equals(null)은 false여야한다.
* 클래스를 상속받아 확장하면서 value를 추가하면 equals를 재정의하면서 일반규약을 지킬 순 없다.
: 다시 말해 구체 클래스를 확장해 새로운 값을 추가하면서 equals규약을 지킬 수 있는 방법은 없다.
(instanceOf 대신 getClass로 비교해도 되지만 이는 리스코프 원칙을 위반한다)
올바른 equals 구현 가이드라인
1. == 비교
2. instanceOf 비교
3. 올바른 타입으로 형변환
4. 필드 비교
주의 사항
1. equals를 재정의 하면 반드시 hashCode도 재정의하라
2. 너무 복잡하게 하지 말라
3. 매개변수는 반드시 Object 형이어야한다.
'언어 > 자바' 카테고리의 다른 글
자바 표현식 몰랐던 사실 정리 (0) | 2019.08.12 |
---|---|
[Effective java] equals를 재정의하려거든 hashCode도 재정의하라 (0) | 2019.07.24 |
java.util.Date와 LocalDateTime (0) | 2019.07.20 |
[Effective java] 생성자 대신 정적 팩터리 메소드를 고려하라 (0) | 2019.07.20 |
Autoboxing And Unboxing (0) | 2019.07.14 |