아이템 21. 인터페이스는 구현하는 쪽을 생각해 설계하라. - ksw6169/effective-java GitHub Wiki
디폴트 메소드 도입 후의 문제점
자바 8부터 인터페이스에 디폴트 메소드를 추가할 수 있는 기능이 도입되었으나, 기존 구현체들은 디폴트 메소드의 도입을 몰랐기 때문에 이런 변화에 발맞춰 수정될 기회가 없었다.
따라서 자바 8과 자바 8에서 제공하는 인터페이스를 구현한 모든 기존 구현체들은 매끄럽게 연동되리라는 보장이 없다. (자바 플랫폼 라이브러리는 이에 대응해 개발되었으니 문제가 없을 수 있다.)
예컨대 자바 8의 Collection 인터페이스에는 다음과 같은 디폴트 메소드가 제공되었다.
/** * 반복자를 이용해 순회하면서 주어진 Predicate에 각 원소가 인수로 주어졌을 때 * true를 반환하는 경우 그 원소는 제거된다. */defaultbooleanremoveIf(Predicate<? superE> filter) {
Objects.requireNonNull(filter);
booleanremoved = false;
finalIterator<E> each = iterator();
while (each.hasNext()) {
if (filter.test(each.next())) {
each.remove();
removed = true;
}
}
returnremoved;
}
apache.commons.collections4의 SynchronizedCollection은 Collection 인터페이스를 구현한 기존 클래스로 클라이언트가 제공한 Collection 객체로 락을 거는 기능을 추가로 제공한다.
즉, 모든 메소드에서 주어진 락 객체로 동기화한 후 내부 컬렉션 객체에 기능을 위임하는 래퍼 클래스다.