[Java] Effective Java 정리 - (Item 10 ~ Item 14)
10. equals는 일반 규약을 지켜 재정의하라
- 꼭 필요한 경우가 아니면 equals를 재정의하지 않는게 좋다.
- 많은 경우에 Object의 equals가 우리가 원하는 비교를 정확히 수행한다.
- 재정의해야할 때는 그 클래스의 핵심 필드 모두를 빠짐없이, 다섯 가지 규약을 확실히 지켜가며 비교해야 한다.
11. equals를 재정의하려거든 hashCode도 재정의하라.
- equals를 재정의할 때는 hashCode도 반드시 재정의해야 한다.
그렇지 않으면 프로그램이 제대로 동작하지 않을 것이다.
- 재정의한 hashCode는 Object의 API 문서에 기술된 일반 규약을 따라야 하며,
서로 다른 인스턴스라면 되도록 해시코드도 서로 다르게 구현해야 한다.
- 이런 구현 방식이 귀찮다면, AutoValue 프레임워크를 사용하면
멋진 equals와 hashCode를 자동으로 만들어준다. IDE들도 이런 기능을 일부 제공한다.
12. toString을 항상 재정의하라
- 모든 구체 클래스에서 Object의 toString을 재정의하자.
- 상위 클래스에서 이미 알맞게 재정의한 경우는 예외
- toString을 재정의한 클래스는 사용하기도 좋고 그 클래스를 사용한 시스템을 디버깅하기 쉽게 해준다.
- toString은 해당 객체에 관한 명확하고 유용한 정보를 읽기 좋은 형태로 반환해야 한다.
13. clone 재정의는 주의해서 진행하라
- 새로운 인터페이스를 만들 때는 절대 Clonable을 활장해서는 안되며, 새로운 클래스도 이를 구현해서는 안됀다.
- final 클래스라면 Clonable을 구현해도 위험이 크진 않지만, 성능 최적화 관점에서 검토한 후 별다른 문제가 없을 때만 드물게 허용해야 한다.
- 기본 원칙은 '복제 기능은 생성자와 팩토리를 이용하는게 최고' 이다.
- 단 배열만은 clone메서드 방식이 가장 깔끔한 합당한 예외라 할 수 있다.
14. Comparable을 구현할지 고려하라
- 순서를 고려해야 하는 값 클래스를 작성한다면 꼭 Comparable 인터페이스를 구현하여, 그 인스턴스들을 쉽게 정렬하고, 검색하고, 비교 기능을 제공하는 컬렉션과 아우러지도록 해야 한다.
- compareTo 메서드에서 필드의 값을 비교할 때 <와 > 연산자는 쓰지 말아야 한다.
- 대신 박싱된 기본 타입 클래스가 제공하는 정적 compare 메서드나 Comparator 인터페이스가 젲공하는 비교자 생성 메서드를 사용하자.