이펙티브 자바, 쉽게 정리하기 - item 21. 인터페이스는 구현하는 쪽을 생각해 설계하라
인터페이스의 수정과 디폴트 메서드
- 자바8 이전에는 인터페이스는 한번 정의되면 절대 새로운 메서드가 추가되거나 기존 메서드가 사라지지 않는다는 전제 하에 코드를 작성했다.
- 자바8 에서 디폴트 메서드가 등장하며 새로운 메서드를 추가할 수 있게 되었다.
- 주로 람다를 활용하기 위해서이다.
- 하지만 위험이 사라진 것은 아니다.
- 생각할 수 있는 모든 상황에서 불변식을 해치지 않는 디폴트 메서드를 작성하는 것은 쉽지 않다.
- 디폴트 메서드를 선언하면, 디폴트 메서드를 재정의하지 않은 모든 클래스에서 디폴트 구현이 쓰이게 된다.
removeIf
메서드로 보는 인터페이스 디폴트 메서드의 예
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
클래스와 같은 경우, 이를 재정의해야 한다.- 자바에서 기본으로 제공하는 API의 경우 이에 대해 빠르게 대응이 가능했다.
- 하지만, 외부에서 제공하는 API는 이러한 내용을 알기 힘들어 대응이 느리다.
디폴트 메서드가 기존 구현체에 런타임 에러를 일으킬 수도 있다
- 디폴트 메서드가 기존 구현체와 충돌할 수 있다.
- 디폴트 메서드로 새 메서드를 추가하는 일은 꼭 필요한 경우가 아니라면 피해야 한다.
- 인터페이스를 설계할 때는 여전히 세심한 주의를 기울여야 한다.
- 인터페이스를 릴리즈한 후라도 결함을 수정하는게 가능한 경우도 있지만, 그 가능성에 기대선 안 된다.
반응형
'Java > 이펙티브 자바' 카테고리의 다른 글
이펙티브 자바, 쉽게 정리하기 - item 23. 태그 달린 클래스보다는 계층구조를 활용하라 (0) | 2022.01.09 |
---|---|
이펙티브 자바, 쉽게 정리하기 - item 22. 인터페이스는 타입을 정의하는 용도로만 사용하라 (0) | 2022.01.04 |
이펙티브 자바, 쉽게 정리하기 - item 20. 추상 클래스보다는 인터페이스를 우선하라 (0) | 2022.01.04 |
이펙티브 자바, 쉽게 정리하기 - item 19. 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라. (0) | 2022.01.04 |
이펙티브 자바, 쉽게 정리하기 - item 18. 상속보다는 컴포지션을 사용하라 (2) | 2022.01.04 |