Open tonykang22 opened 1 year ago
fail-fast 이터레이터
를 사용해 콜렉션을 순회하는 중에 콜렉션을 변경하는 경우List.of
로 만든 Collection: Immutable Collection
UnsupportedOperationException
을 던진다.ConcurrentModificationException
: Iterator가 도는 상황에 Collection이 변경되었을 경우에 발생
Iterator.remove()
사용과 같기 때문이다.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);
}
}
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);
}
}
아이템 21. 인터페이스는 구현하는 쪽을 생각해 설계하라.
핵심 정리
삽입
될 뿐이다.예시 1
기존 인터페이스에 디폴트 메서드 구현을 추가하는 것은 위험한 일이다.
예시 2
디폴트 메서드는 기존 구현체에 런타임 오류를 일으킬 수 있다.
hello()
를 실행하려 한다.IllegalAccessError
가 발생하게 될 것이다.