본문 바로가기

Dev Book Review/Effective Java

[Effective Java] item21. 인터페이스는 구현하는 쪽을 생각해 설계하라

생각할 수 있는 상황에서 불변식을 해치지 않는 디폴트 메서드 작성은 어렵다.

  • 디폴트 메서드는 구현 클래스에 대해 아무 것도 모른채 합의 없이 무작정 '삽입'될 뿐이다.
  • Java8 : 컬렉션 인터페이스 다수에 디폴트 메서드 추가
  • 범용적으로 구현되어있지만, 모든 구현체와 어울리는 것은 아니다.

 

1. SynchronizedCollection

아파치 버전

  • 클라이언트가 제공한 객체로 락을 거는 능력을 추가로 제공
  • 모든 메서드에서 주어진 락 객체로 동기화한 후 내부 컬렉션 객체에 기능 위임
  • removeIf : 재정의 되어있지 않았음 (동기화에 대해 모르는 상태)


2. 인터페이스 설계에 주의하자

a. 디폴트 메서드

  • 디폴트 메서드는 (컴파일에 성공하더라도) 기존 구현체에 런타임 오류를 일으킬 수 있다.
  • 꼭 필요한 경우가 아니면 디폴트 메서드로 새 메서드를 추가하는 일은 꼭 필요한 경우가 아니면 피하자
  • 새로운 인터페이스를 만들때는 아주 유용한 수단이다
  • 기존 메서드를 제거하거나 수정하는 용도가 아니다.
  • 클라이언트에 영향이 어마어마하게 가기 때문이다.
 
b. 설계 시 주의

디폴트 메서드가 생겼더라도 인터페이스를 설계할 때는 여전히 세심한 주의를 기울여야한다.

  • 인터페이스 설계시 검증을 위해 최소 3가지의 구현체를 만들어보자
  • 인터페이스를 릴리즈한 후라도 결함을 수정하는게 가능한 경우도 있지만, 절대 이 가능성에 기대지 말자.