🤓 스터디/이펙티브 자바
[아이템 21] 인터페이스는 구현하는 쪽을 생각해 설계하라
강켄트
2023. 3. 31. 12:35
자바 8 전에는 기존 구현체를 깨뜨리지 않고는 인터페이스에 메서드를 추가할 방법이 없었다.
기존 인터페이스에 메서드를 추가했을 때, 기존 구현체에 이미 존재할 가능성이 아주 낮기 때문에
정의되지 않은 추가 된 메서드로 인해 컴파일 오류가 발생한다.
자바 8에 와서 기존 인터페이스에 메서드를 추가할 수 있도록 디폴트 메서드가 나왔다.
디폴트 메서드에 대해 정리가 잘 되어있는 것 같아서 첨부해본다.
https://siyoon210.tistory.com/95
그러나 모든 기존 구현체들과 매끄럽게 연동되리라는 보장은 없고,
생각할 수 있는 모든 상황에서 불변식을 해치지 않는 디폴트 메서드를 작성하기는 어렵다.
Collection 인터페이스에 추가된 removeIf 메서드
위 코드를 보면 Predicate가 true를 반환하는 모든 원소를 제거한다.
코드를 이보다 더 범용적으로 구현하기도 어렵겠지만,
그렇다고 해서 현존하는 모든 Collection 구현체와 잘 어우어지는 것은 아니다.
default boolean removeIf(Predicate<? super E> filter) {
Objects.requireNonNull(filter);
boolean removed = false;
final Iterator<E> each = iterator();
while (each.hasNext()) {
if (filter.test(each.next())) {
each.remove();
removed = true;
}
}
return removed;
}
디폴트 메서드는 컴파일에 성공하더라도 기존 구현체에 런타임 오류를 일으킬 수 있다.
그러므로 인터페이스를 설계할 때는 여전히 세심한 주의를 기울여야 한다.
ps
자바8부터 도입된 인터페이스의 디폴트 메서드를 통해 새로운 메서드를 추가하더라도
기존에 모든 구현체들과 매끄럽게 연동되지 않을 수 있기 때문에
인터페이스 설계 시 주의가 필요하겠다.