카테고리 없음

[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

인터페이스의 역할은 자신의 인스턴스로 무엇을 할 수 있는지 클라이언트에 얘기해주는 것.