[Effective Java 3/e] 아이템 21 - 인터페이스는 구현하는 쪽을 생각해 설계하라


아이템 21 - 인터페이스는 구현하는 쪽을 생각해 설계하라

  • 모든 상황에서 불변식을 해치지 않는 디폴트 메서드를 작성하기란 어렵다.
  • 디폴트 메서드는 기존 구현체에 런타임 오류를 일으킬 수 있다.
  • 인터페이스를 설계 할 때는 세심한 주의를 기울여야 한다.

자바 8의 Collection 인터페이스에 추가된 디폴트 메서드

default boolean removeIf(Predicate<? super E> filter) {
  Objects.requireNonNull(filter);
  boolean result = false;
  for (Iterator<E> it = iterator(); it.hasNext();) {
    if (filter.test(it.next())) {
      it.remove();
      result = true;
    }
  }
  return result;
}
  • 아파치 SynchronizedCollection는 모든 메서드에 주어진 락 객체로 동기화한 후 내부 컬렉션 객체에 기능을 위임하는 래퍼 클래스
    • removeIf를 재정의 하지 않았으므로 락 객체 사용 불가