Search Results for 'C.S.E/Java'

34 POSTS

  1. 2008/07/12 Java API에서 Inheritance와 Composition의 원칙을 어기는 경우

1.상속(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의 값을 반환한다.


- 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

« PREV : 1 : 2 : 3 : 4 : 5 : ... 34 : NEXT »