본문 바로가기
728x90

이펙티브 자바3

Item 69. 예외는 진짜 예외 상황에만 사용하라 코드 부터 보자. 1 2 3 4 5 6 7 8 9 try { int i = 0; while (true) { range[i++].climb(); } } catch (ArrayIndexOutOfBoundsException e) { } Colored by Color Scripter cs 이 코드는 배열의 끝에 도달하면 에러를 던져 코드를 종료한다. for-each loop 를 사용하지 않고 이처럼 작성한 이유는 다음과 같다. JVM은 배열에 접근할 때마다 경계를 넘었는지를 검사한다. 반복문 또한 배결 경계에 도달하면 종료한다. 따라서 반복문을 사용하면 경계 검사가 중복되므로 하나를 생량한 것이다. 하지만 이는 다음과 같은 이유로 잘못된 추론이다. 1. 예외는 예외 상황에서만 사용할 목적으로 설계되었으므로 JV.. 2022. 4. 17.
Item 46. 스트림에서는 부작용 없는 함수를 사용하라 스트림 패러다임의 핵심은 계산을 일련의 변환(transformation)으로 재구성하는 것이다. 여기서 각 변환은 가능한 이전 단계의 결과를 받아서 처리하는 순수 함수여야 한다. 이를 위해서는 스트림 연산에 건네는 함수 객체는 모두 side-effect가 없어야 한다. 아래의 예시를 보자. 1 2 3 4 5 6 7 Map freq = new HashMap(); try (Stream words = new Scanner(file).tokens()) { words.forEach(word -> { freq.merge(word.toLowerCase(), 1L, Long::sum); }) } Colored by Color Scripter cs 이 코드는 스트림을 가장한 반복적 코드다. 위에서 명시했듯 스트림에서 사.. 2022. 3. 2.
Item 10. equals는 일반 규약을 지켜 재정의하라 equals 메서드는 재정의하기 쉬워보이지만 잘못 정의하면 큰 문제가 된다. 따라서 문제를 회피하는 가장 쉬운 방법은 재정의를 하지 않는 거다. 그러면 euqals의 메서드 원형은 다음과 같기 때문에 자기 자신과만 같게 된다. 1 2 3 public boolean equals(Object obj) { return (this == obj); } Colored by Color Scripter cs 다음 상황 중 하나라도 해당한다면 euqlas 메서드를 재정의 하지 말라. 각 인스턴스가 본질적으로 고유하다. 각 인스턴스가 고유할 때, 즉, 각 인스턴스의 상태가 중복이 되지 않을 때는 euqals를 재정의 하지 말라. euqals는 깊은 비교를 해야 할 때 사용하라. 인스턴스의 논리적 동치성(logical eq.. 2022. 2. 24.
728x90