EJ2E Item 17. 상속에 대한 설계와 문서화를 제대로 하지 않을 거면 아예 상속을 허용하지 말라.
Java : 2009. 1. 13. 22:38
참조: Effective Java 2nd Edition Item 17: Design and document for inheritance or else prohibit it.
오버라이딩이 가능한 메소드에는 반드시 문서화를 해야 한다.
- "This implementation ~~" 즉 "이 구현체에서는.." 이라는 식으로 다음 배포 때는 다르게 구현할 수도 있다는 의미를 내포하는 문서화와 그 내용을 자세히 알려줘야 한다.
상속을 고려한 클래스를 테스트하는 유일한 방법은 하위클래스를 작성하는 것이다.
- 배포하기 전에 반드시 하위클래스를 작성해서 테스트 해봐야 한다.
생성자에서 오버라이딩이 가능한 메소드를 직접적으로든 간접적으로든 호출하면 안 된다.
- 상위 클래스 생성자에서 하위 클래스가 오버라이딩한 메소드를 호출하다가 아직 필드 초기화도 안 된 하위 클래스의 필드를 사용해서 원치 않던 결과가 발생할 수 있다.
Cloneable과 Serializable 인터페이스를 구현한 클래스가 상위클래스가 될 여지가 있다면
- 생성자와 마찬가지로 clone과 readObject에서 오버라이딩이 가능한 메소드를 호출하지 않도록 한다.
안전하게 상속하도록 문서화 하거나 설계하지 않은 클래스를 상속할 수 없도록 하는 것이 최선책이다.
- 두 가지 방법 중에서 쉬운 방법은 클래스를 final로 만드는 것이다.
- 두 번째 방법은 모든 생성자를 private 또는 package-private으로 만들고 public static 팩터리를 추가한다. 이 방법은 내부적으로 상속이 가능해서 약간 더 유연하다. Item 15에서 다뤘다.
오버라이딩이 가능한 메소드에는 반드시 문서화를 해야 한다.
- "This implementation ~~" 즉 "이 구현체에서는.." 이라는 식으로 다음 배포 때는 다르게 구현할 수도 있다는 의미를 내포하는 문서화와 그 내용을 자세히 알려줘야 한다.
상속을 고려한 클래스를 테스트하는 유일한 방법은 하위클래스를 작성하는 것이다.
- 배포하기 전에 반드시 하위클래스를 작성해서 테스트 해봐야 한다.
생성자에서 오버라이딩이 가능한 메소드를 직접적으로든 간접적으로든 호출하면 안 된다.
- 상위 클래스 생성자에서 하위 클래스가 오버라이딩한 메소드를 호출하다가 아직 필드 초기화도 안 된 하위 클래스의 필드를 사용해서 원치 않던 결과가 발생할 수 있다.
Cloneable과 Serializable 인터페이스를 구현한 클래스가 상위클래스가 될 여지가 있다면
- 생성자와 마찬가지로 clone과 readObject에서 오버라이딩이 가능한 메소드를 호출하지 않도록 한다.
안전하게 상속하도록 문서화 하거나 설계하지 않은 클래스를 상속할 수 없도록 하는 것이 최선책이다.
- 두 가지 방법 중에서 쉬운 방법은 클래스를 final로 만드는 것이다.
- 두 번째 방법은 모든 생성자를 private 또는 package-private으로 만들고 public static 팩터리를 추가한다. 이 방법은 내부적으로 상속이 가능해서 약간 더 유연하다. Item 15에서 다뤘다.
'Java' 카테고리의 다른 글
클래스파일 보기 (5) | 2009.07.20 |
---|---|
Double.MAX_VALUE는 좀 특이하군요 @_@ (4) | 2009.05.19 |
EJ2E Item 20. 태그가 있는 클래스 대신 클래스 계층구조를 선호하라. (0) | 2009.03.13 |
EJ2E Item 19. 인터페이스는 오직 타입을 정의할 때만 사용하라 (0) | 2009.01.28 |
EJ2E Item 18. 추상 클래스 보다는 인터페이스를 선호하라 (5) | 2009.01.19 |
EJ2E Item 17. 상속에 대한 설계와 문서화를 제대로 하지 않을 거면 아예 상속을 허용하지 말라. (0) | 2009.01.13 |
EJ2E Item 16. 상속보다 컴포지션을 선호하라 (0) | 2008.12.28 |
EJ2E Item 15. 변경을 최소화하라 (2) | 2008.12.23 |
EJ2E 14. public 클래스에서는 접근 메소드를 사용하지 public 필드를 사용하지 마라. (0) | 2008.12.21 |
EJ2E Item 13. 클래스와 멤버 접근성을 최소화 하라 (0) | 2008.11.07 |
EJ2E Item 12. Comparable 구현을 고려하라 (0) | 2008.11.04 |