아이템 21 : 인터페이스는 구현하는 쪽을 생각해 설계하라
자바 8 이전에는 기존 구현체를 깨뜨리지 않고서는 인터페이스에 메서드를 추가할 방법이 없었으나, 자바 8 에서 디폴트 메서드를 제공하면서 가능해졌습니다.
디폴트 메서드
해당 인터페이스를 구현한 후 디폴트 메서드를 재정의하지 않은 모든 클래스에서 디폴트 구현이 쓰이게됩니다.
🧑💻 : 와 그러면 인터페이스 설계할때 가볍게하고 나중에 디폴트 메서드를 추가해도 괜찮네요
👩 : 그러면 안돼요.
🧑💻 : ???
디폴트 메서드는 구현 클래스에 대해 아무것도 모른채 합의 없이 무작정 삽입될 뿐입니다.
생각할 수 있는 모든 상황에서 불변식을 해치지 않는 디폴트 메서드를 작성하기란 어려운법!
- 자바 8의 Collection 인터페이스에 removeIf 메서드가 추가됨
- org.apache.commons.collections4.collection.SynchronizedCollection 클래스는 java.util.Collection 인터페이스를 구현하고있음
- 모든 메서드에서 주어진 락 객체로 동기화한 후 내부 컬렉션 객체에 기능을 위임
- 책이 쓰여지는 시점에는 SynchronizedCollection에 removeIf 메서드가 재정의 되어있지 않음
- 자바 8 환경에서 해당 클래스를 사용하는 경우 removeIf 디폴트 구현을 물려받게 되고, SynchronizedCollection 과는 어울리지 않는 동작을 수행함
디폴트 메서드라는 도구가 생겼더라도 인터페이스를 설계할 때는 여전히 세심한 주의를 기울여야합니다.
디폴트 메서드는 인터페이스로부터 메서드를 제거하거나 기존 메서드의 시그니처를 수정하는 용도가 아닙니다.
Reference
반응형
'☕️ JAVA > Effective JAVA' 카테고리의 다른 글
[Effective Java] 아이템 42 : 익명 클래스보다는 람다를 사용하라 (0) | 2022.01.08 |
---|---|
[Effective Java] 아이템 32 : 제네릭과 가변인수를 함께 쓸 때는 신중하라 (0) | 2022.01.06 |
[Effective Java] 아이템 5 : 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 (0) | 2022.01.02 |
[Effective Java] 아이템 68 : 일반적으로 통용되는 명명 규칙을 따르라 (0) | 2021.12.18 |
[Effective Java] 아이템 49 : 매개변수가 유효한지 검사하라 (0) | 2021.12.04 |