tonykang22 / study

0 stars 0 forks source link

[이펙티브 자바] 아이템 21. 인터페이스는 구현하는 쪽을 생각해 설계하라. #145

Open tonykang22 opened 1 year ago

tonykang22 commented 1 year ago

아이템 21. 인터페이스는 구현하는 쪽을 생각해 설계하라.

핵심 정리



예시 1

기존 인터페이스에 디폴트 메서드 구현을 추가하는 것은 위험한 일이다.

    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;
    }



예시 2

디폴트 메서드는 기존 구현체에 런타임 오류를 일으킬 수 있다.

public class SuperClass {

    private void hello() {
        System.out.println("hello class");
    }
}
public class SubClass extends SuperClass implements MarkerInterface {

    public static void main(String[] args) {
        SubClass subClass = new SubClass();

        // 만약 MarkInterface의 default 메서드가 없다면 컴파일 에러 발생
        subClass.hello();
    }

}
public interface MarkerInterface {

    default void hello() {
        System.out.println("hello interface");
    }

}



tonykang22 commented 1 year ago

완벽 공략 38. ConcurrentModificationException

현재 바뀌면 안되는 것을 수정할 때 발생하는 예외

image



예시


예외 발생 O

public class FailFast {

    public static void main(String[] args) {
        List<Integer> numbers = new ArrayList<>();
        numbers.add(1);
        numbers.add(2);
        numbers.add(3);
        numbers.add(4);
        numbers.add(5);

        // 이터레이터로 콜렉션을 순회하는 중에 Collection의 remove를 사용한다면...
        for (Integer number : numbers) {
            if (number == 3) {
                // 이 단계에서 ConcurrentModificationException이 던져진다.
                numbers.remove(number);
            }
        }

        // 출력
        numbers.forEach(System.out::println);
    }
}


예외 발생 X

public class FailFast {

    public static void main(String[] args) {
        List<Integer> numbers = new ArrayList<>();
        numbers.add(1);
        numbers.add(2);
        numbers.add(3);
        numbers.add(4);
        numbers.add(5);

        // 이터레이터의 remove 사용하기
        for (Iterator<Integer> iterator = numbers.iterator(); iterator.hasNext(); ) {
            Integer integer = iterator.next();
            if (integer == 3) {
                iterator.remove();
            }
        }

        // 인덱스 사용하기
//        for (int i = 0; i < numbers.size() ; i++) {
//            if (numbers.get(i) == 3) {
//                numbers.remove(numbers.get(i));
//            }
//        }

        // removeIf 사용하기
//        numbers.removeIf(number -> number == 3);

        // 출력
        numbers.forEach(System.out::println);
    }
}