카테고리 없음
[effective_java] item20, item21, item22
extra_
2022. 12. 17. 22:58
Item20 : 추상 클래스보다는 인터페이스를 우선하라.
Item21 : 인터페이스는 구현하는 쪽을 생각해 설계하라.
Item22 : 인터페이스는 타입을 정의하는 용도로만 사용하라.
Item20
인터페이스는 implements 를 사용해 간단하게 구현할 수 있지만
abstract class는 클래스에 끼워넣기 어렵다.
인터페이스는 클래스가 원래 구현하는 주된 타입 외에 선택적 행위를 한다고 선언하는 효과가 있음. -> 유연성
- 골격 구현
- 자바에서 제공하는 Comparable, Iterable, AutoClaseable 인터페이스의 기능
item21
Collection인터페이스에서 사용되는 removeIf 함수를 디폴트 메서드로 예시를 들었는데 (아래코드)
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;
}
이 메서드는 SynchronizedCollection 클래스(잘 쓰이지 않음, 자바8기준, Collection구현체)와 호환이 어렵다고 한다.
그래서 SynchronizedCollection에서 removeIf를 호출하면 예기치 못한 결과로 이어질 수 있음.
removeIf와 같은 디폴트 메서드가 기존 구현체에 런타임오류를 가져올지, 인터페이스 설계시 어떤 위험이 있을지 고려해야한다.
Item22
인터페이스의 역할은 자신의 인스턴스로 무엇을 할 수 있는지 클라이언트에 얘기해주는 것.