equals 메소드를 오버라이딩 하지 않는게 되도록 좋다. 특별한경우 가 아니라면!
private 이거나 package 전용 클래스라서 이클래스의 equals 메소드가 절대 호출되지 않아야 할 경우.
@Override public boolean equals(Object o){
throw new AssertionError(); // 에러를 발생 시켜준다.
}
특별한 경우 오버라이딩 되도록 해도 좋다. Value 클래스 같은경우 하나의 값을 나타내는 클래스로써 Integer Date와 같은것들이다. 같은 객체 참조 여부는 중요하지 않고 객체가 갖는 값이 논리적으로 같은지가 관심있는 클래스의 경우다. Map 이나 Set 의 요소로 사용될경우 equals 메소드의 오버라이딩이 꼭 필요하다. 같은 값의 객체가 이미 있는지 비교하는 수단을 제공해야 되기 떄문이다.
equals 메소드가 만족해야 하는 속성
상속을 사용할경우 완벽한 equals 를 구현하기 힘들다. 차라리 Composition( 변수로 선언 ) 을 하는것이 좋다.
float double 이 아닌 기본 필드경우에는 == 연산자로 비교하며 필드가 객체 참조일때는 eqauls 메소드를 재귀적으로 다시 호출한다. Float 객체의 경우 Float.compare Dobule 은 Double.compare 메소드를 사용한다.(floating point problem) Float.eqauls 나 Double.equals 를 사용해도 된다. 객체가 null 을 가질수도 있으므로
(field == null ? o.field == null field.equals(o.field))