재정의 하지 않아도 되는 사항
각 인스턴스가 본질적으로 고유하다. (동작하는 개체를 표현하는 클래스)
인스턴스의 논리적 동치성을 검사할일이 없다.
상위 클래스에서 재정의한 equals가 하위 클래스에도 딱 들어 맞는다.
클래스가 private이거나 package-private이고 equals 메서드를 호출할일이 없다.
재정의를 해야할 상황
equlas 메소드는 '메모리 주소를 기반으로 물리적으로 같은가? ' 가 아니라 논리적 동치성을 비교를 해야 할때
Map의 키, Set의 원소 등으로 사용하려면 재정의해야 한다.
동치 관계란?
수학에서, 동치관계(同値關係, 영어: equivalence relation)는 논리적 동치와 비슷한 성질들을 만족시키는 이항관계이다.
x,y,z는 null이 아니라고 전제한다.
좋은 equals 재정의
== 연산자를 사용해 자기 자신의 참조인지 확인해라
instanceof 연산자로 입력이 올바른 타입인지 확인해라, null 검사도 해준다.
입력을 올바른 타입으로 형변환해라
입력 객체와 자기 자신의 대응되는 핵심 필드들이 모두 일치하는지 하나씩 검사해라
성능을 위해 다를 가능성이 크거나, 비용이 싼 필드 먼저 비교해라
toString 메서드는 간결하고 읽기 쉬운 형태의 유익한 정보를 반환해야 한다.
이를 잘 구현하는 클래스는 사용하기 좋고 디버깅을 쉽게 해준다.
좋은 toString 재정의 방법
객체가 가진 주요 정보들을 모두 반환해야 한다.
주석으로 toString이 반환하는 포맷을 명시하든 아니든 의도를 명확하게 해야한다.
toString이 반환한 값에 포함된 정보를 얻어올 수 있는 API를 제공하자
toString 재정의가 필요없는 경우
대부분의 정적 유틸리티 클래서
대부분의 열거 타입
슈퍼 클래스에서 이미 적절하게 재정의한 경우
실무에서는 ToStringBulider을 추천
public String toString(Object object) {
return EqualsBuilder.reflectionEquals(this, object);
}
Cloneable은 복제해도 되는 클래스임을 명시하는 용도의 인터페이스이다.그러나 Clone 메소드가 선언된것은 Object 클래스 이며 그 마저도 protected로 지정되어 있다.
//복사 생성자
public User (User user){
// ...
}
//복사 팩토리
public static User newInstance(User user){
//...
}
Comparable 인터페이스 메소드는 CompareTo이다.