728x90
생각할 수 있는 상황에서 불변식을 해치지 않는 디폴트 메서드 작성은 어렵다.
- 디폴트 메서드는 구현 클래스에 대해 아무 것도 모른채 합의 없이 무작정 '삽입'될 뿐이다.
- Java8 : 컬렉션 인터페이스 다수에 디폴트 메서드 추가
- 범용적으로 구현되어있지만, 모든 구현체와 어울리는 것은 아니다.
1. SynchronizedCollection
아파치 버전
- 클라이언트가 제공한 객체로 락을 거는 능력을 추가로 제공
- 모든 메서드에서 주어진 락 객체로 동기화한 후 내부 컬렉션 객체에 기능 위임
- removeIf : 재정의 되어있지 않았음 (동기화에 대해 모르는 상태)
2. 인터페이스 설계에 주의하자
a. 디폴트 메서드
- 디폴트 메서드는 (컴파일에 성공하더라도) 기존 구현체에 런타임 오류를 일으킬 수 있다.
- 꼭 필요한 경우가 아니면 디폴트 메서드로 새 메서드를 추가하는 일은 꼭 필요한 경우가 아니면 피하자
- 새로운 인터페이스를 만들때는 아주 유용한 수단이다
- 기존 메서드를 제거하거나 수정하는 용도가 아니다.
- 클라이언트에 영향이 어마어마하게 가기 때문이다.
b. 설계 시 주의
디폴트 메서드가 생겼더라도 인터페이스를 설계할 때는 여전히 세심한 주의를 기울여야한다.
- 인터페이스 설계시 검증을 위해 최소 3가지의 구현체를 만들어보자
- 인터페이스를 릴리즈한 후라도 결함을 수정하는게 가능한 경우도 있지만, 절대 이 가능성에 기대지 말자.
'Dev Book Review > Effective Java' 카테고리의 다른 글
[Effective Java] item23. 태그 달린 클래스보다는 클래스 계층 구조를 활용하라하라 (0) | 2020.05.05 |
---|---|
[Effective Java] item22. 인터페이스는 타입을 정의하는 용도로만 사용하라 (0) | 2020.05.05 |
[Effective Java] Item20. 추상 클래스 보다는 인터페이스를 우선하라 (0) | 2020.05.05 |
[Effective Java] item 19. 상속을 고려해 설계하고 문서화하라. 그렇지 않았다면 상속을 금지하라 (0) | 2020.05.05 |
[Effective Java] Item18. 상속보다는 컴포지션을 사용하라 (0) | 2020.05.05 |