Closed okhee closed 2 years ago
Thread
Pattern
private
equals()
Set
x, y, z는 non-null이라고 가정
다음 명제, 식은 모두 true여야 한다.
true
null
순서대로 반사성(Reflexivity), 대칭성(symmetry), 추이성(transitivity), 일관성(consistency), null-아님 규칙이다.
CaseInsensitiveString > equals(Object o)
String
Point
ColorPoint
ColorPoint > equals()
getClass()를 이용하는 방법은 ColorPoint가 Point로 활용될 수 없게 만듦
x.equals(null)
x instanceof clazz
false
if (this == o) return true
instanceof
입력 객체와 자기 자신의 '핵심 필드'들을 비교
public final class PhoneNumber { private final short areaCode, prefix, lineNum;
@Override public boolean equals(Object o) { if(o == this) { return true; }
// 추가적으로 o가 null 인지 확인 불필요 if(!(o instanceof PhoneNumber)) { return false; } PhoneNumber pn = (PhoneNumber)o; return pn.lineNum == lineNum && pn.prefix == prefix && pn.areaCode == areaCode;
} }
equals
Object
결론
(웬만하면) 재정의하지 않는다
다음에 해당하는 경우 재정의 금지
Thread
Pattern
private
등이어서 호출할 일이 없다equals()
로도 충분 e.g.Set
다음에 해당할 때 재정의 고려
equals()
는 기본적으로 객체 식별성(object identity)를 비교하는데,equals()
로 논리적 동치성을 확인해야 하는 값 클래스일 때equals()
재정의 시 따라야 하는 5가지 규칙다음 명제, 식은 모두
true
여야 한다.null
순서대로 반사성(Reflexivity), 대칭성(symmetry), 추이성(transitivity), 일관성(consistency), null-아님 규칙이다.
equals()
규약 굳이 어겨보기CaseInsensitiveString > equals(Object o)
에서 굳이 o가String
인 경우까지 고려하기Point
클래스와 이를 상속해 색깔 정보를 추가한ColorPoint
대칭성 보장을 위해ColorPoint > equals()
에서Point
인 case에서 분기 이 경우 추이성이 깨짐equals()
판단에 불확실하거나 신뢰할 수 없는 자원이 간섭하면 안 된다.null
x.equals(null)
이 절대true
일 수 없다.x instanceof clazz
에서 x가 null이면false
를 반환하는 점을 이용올바른
equals()
재정의 방법if (this == o) return true
instanceof
로 입력이 올바른 타입인지 확인 올바른 타입: 현재 클래스, 또는 상위 인터페이스입력 객체와 자기 자신의 '핵심 필드'들을 비교
@Override public boolean equals(Object o) { if(o == this) { return true; }
} }
마지막 주의 사항
11
equals
의 매개변수 타입은 무조건Object
이어야 한다.