default boolean removeIf(Predicate<? super E> filter) {
Objects.requireNonNull(filter);
boolean result = false;
for (Iterator<E> it = iterator();it.hasNext();) {
if (filter.test(it.next())) {
it.remove();
result = true;
}
}
return result;
}
코드 자체가 범용적이나 모든 Collection 구현체와 잘 어우러지는 것은 아님.
예시) 아파치의 SynchronizedCollection
위에서 정의한 java 8의 removeIf 디폴트 구현으로는, 아파치의 락 객체를 모르므로 사용할 수 없음.
동기화가 되지 못하고 위험한 결과가 생길 수 있음.
자바에서도 필요한 부분에서는 디폴트 메소드 재정의를 진행함.
자바의 SyunchronizedCollection은 removeIf를 재정의하고 있음.
@Override
public boolean removeIf(Predicate<? super E> filter) {
synchronized (mutex) {return c.removeIf(filter);}
}
인터페이스는 구현하는 쪽을 생각해 설계하라
시간이 지나면서 기존 인터페이스에 메소드가 추가해야 하면 어떻게 해야할까?
Collection
인터페이스에 디폴트 메소드가 추가됨.Collection
구현체와 잘 어우러지는 것은 아님.SynchronizedCollection
removeIf
디폴트 구현으로는, 아파치의 락 객체를 모르므로 사용할 수 없음.SyunchronizedCollection
은removeIf
를 재정의하고 있음.인터페이스를 설계할때는 주의를 기울여서 설계하자