본문 바로가기

Reading/Effective Java

(65)
[Effective-Java] Item 37. ordinal 인덱싱 대신 EnumMap을 사용하라 문제: ordinal 값을 배열의 인덱스로 사용하는 방법 아래 코드는 식물을 나타내기 위한 클래스다. public class Plant { // 생애주기(한해살이, 여러해살이, 두해살이) enum LifeCycle { ANNUAL, PERENNIAL, BIENNIAL } final String name; final LifeCycle lifeCycle; Plant(String name, LifeCycle lifeCycle) { this.name = name; this.lifeCycle = lifeCycle; } @Override public String toString() { return name; } } Plant[] garden = { new Plant("바질", LifeCycle.ANNUAL), ne..
[Effective-Java] Item 36. 비트 필드 대신 EnumSet을 사용하라 비트 필드란 비트 필드(bit field): 비트별 OR를 사용해 여러 상수를 하나의 집합으로 모을 수 있는 집합. 비트별 연산을 사용해 합집합과 교집합 같은 집합 연산을 효율적으로 수행할 수 있다. ex) text.applyStyles(STYLE_BOLD | STYLE_ITALIC); 열거한 값들이 주로 집합으로 사용될 경우, 이전에는 각 상수에 서로 다른 2의 거듭제곱 값을 할당한 정수 열거 패턴을 사용했다. public class Text { public static final int STYLE_BOLD = 1
[Effective-Java] Item 35. ordinal 메소드 대신 인스턴스 필드를 사용하라 모든 열거 타입은 해당 상수가 그 열거 타입에서 몇 번째 위치인지를 반환하는 ordinal 메소드를 제공한다. 이런 이유로 열거 타입 상수와 연결된 정수 값이 필요하면 이 메소드를 사용하고 싶을 수 있는데 그렇게 해서는 안된다. ordinal을 사용할 경우 문제점 // 연주자 solo(1)~dectet(10) public enum Ensemble { SOLO, DUET, TRIO, QUARTET, QUINTET, SEXTET, SEPTET, OCTET, DOUBLE_QUARTET, NONET, DECTET; public int numberOfMusicians() { return ordinal() + 1; } } 1. 만약 상수 선언 순서를 바꾸면 numberOfMusicians()는 오동작 한다. 2. ..
[Effective-Java] Item 34. int 상수 대신 열거 타입을 사용하라 열거타입: 일정 개수의 상수 값을 정의한 다음 그 외의 값은 허용하지 않는 타입 1. 정수 열거 패턴(int enum pattern)의 단점 public static final int APPLE_FUJI = 0; public static final int APPLE_PIPPIN = 1; public static final int APPLE_GRANNY_SMITH = 2; public static final int ORANGE_NAVEL = 0; public static final int ORANGE_TEMPLE = 1; public static final int ORANGE_BLLOD = 2; 1. 타입 안전을 보장할 방법이 없고 표현력이 좋지 않다. 위의 예시코드는 APPLE과 ORANGE를 바꿔써도 ..