less than 1 minute read

inheritance

public class InstrumentedHashSet<E> extends HashSet<E> {
    private int addCount = 0;

    public InstrumentedHashSet() {
    }

    public InstrumentedHashSet(int initCap, float loadFactor) {
        super(initCap, loadFactor);
    }

    @Override
    public boolean add(E e) {
        addCount++;
        return super.add(e);
    }

    // HashSet의 add 메서드를 통해 구현 되어 있음
    @Override
    public boolean addAll(Collection<? extends E> c) {
        addCount += c.size();
        return super.addAll(c);
    }

    public int getAddCount() {
        return addCount;
    }

}

문제점

InstrumentedHashSet<String> s = new InstrumentedHashSet<String>();

s.addAll(Arrays.asList("apple","banana","grape"); // addCount += 3
// 결국 addAll 호출과정에서 add를 3번 호출 함
// s.add("apple") -> addCount++
// s.add("banana") ->  addCount++
// s.add("grape") -> addCount++
  • 상속은 Is-A 관계가 성립할 때만 하는 것이 적절함
    • InstrumentedHashSetHashSet이 아니라 HashSet을 이용한 무엇 이다.
  • 같은 패키지 안에 있을 때만 한다.

Composition

  • 기존 클래스를 상송 하는 대신에 (InstrumentedHashSet<E> extends HashSet<E>) 상속을 받으려고 했던 클래스에서 기존 객체를 참조하는 private 필드로 설정
  • Forwarding: 새로운 클래스에서 기존 클래스의 함수를 호출하여 결과 반환
  • Has-A 관계
public class InstrumentedHashSet<E> implements HashSet<E> {
  private final HashSet<E> hashSet;
  public InstrumentedHashSet(HashSet<E> hashSet) { this.hashSet = hashSet; }
  
  // @Override ...
}

Tags:

Updated: