Java API에서 Inheritance와 Composition의 원칙을 어기는 경우
Posted 2008/07/12 00:041.상속(Inheritance)을 사용해야 하는 경우
하위클래스가 정말로 상위클래스의 서브타입일 경우에만 상속을 써야 한다. 다시 말해 "is-a" 관계가 성립할 때만 상속을 써야 한다. 클래스 B가 클래스 A를 상속받으려 할 때 반드시 한 번 더 확인해야 한다. "정말 모든 B가 A인가?" 이 질문에 확실히 그렇다고 답하지 못한다면 B는 A를 상속받지 말아야 한다.
또, 이 질문에 아니라고 답한다면, B는 A의 인스턴스를 private 필드로 가져야 하고, 작고 간단한 API만 제공해야 한다. A는 B를 구성하는 필수요소가 아니고 단지 상세 구현의 일부일 뿐이기 때문이다.
2. 자바 플랫폼 라이브러리에서 이 원칙을 명백하기 어기는 것들
아래의 두 경우 모두 상속보다는 컴포지션을 써야 한다.
- Stack is not a Vector
스택은 백터가 아닌 데도 Stack 클래스는 Vector 클래스를 상속받고 있다.
오류 : Vector의 get(int index) method를 사용하면 Stack의 고유 성질인 LIFO가 무시된다. 명시한 index의 값을 반환한다.
오류 : Vector의 get(int index) method를 사용하면 Stack의 고유 성질인 LIFO가 무시된다. 명시한 index의 값을 반환한다.
- Properties is not a Hashtable
속성은 해시 테이블이 아닌 데도 Properties 클래스는 Hashtable 클래스를 상속받고 있다.
오류 : Properties 인스턴스에 대한 참조에 대해 p.getProperty(key)와 p.get(key)이 다른 결과를 리턴하는 경우가 있다.
p.getProperty(key)는 해당 key가 없으면 기본값을 리턴하지만, p.get(key)는 Hashtable에 있는 메소드로 해당 key가 없으면 null을 리턴한다.
출처 : effective java
'C.S.E > Java' 카테고리의 다른 글
| Java API에서 Inheritance와 Composition의 원칙을 어기는 경우 (0) | 2008/07/12 |
|---|---|
| 불변객체 만들기 (0) | 2008/07/11 |
| public static final 배열 보안문제 해결하기 (0) | 2008/07/11 |
| Cloneable Interface 바로 알자. (0) | 2008/07/11 |
| java.lang.Object.hashCode (0) | 2008/07/11 |
| java.lang.Object.equals (0) | 2008/07/11 |
- Filed under : C.S.E/Java
- Comment Trackback
이올린에 북마크하기