[Effective Java 3/e] 아이템 34 - int 상수 대신 열거 타입을 사용하라
아이템 34 - int 상수 대신 열거 타입을 사용하라
열거 타입
- 일정 개수의 상수 값을 정의한 다음, 그 외의 값은 허용하지 않는 타입
- 열거 타입 자체는 클래스
- 상수 하나당 자신의 인스턴스를 하나씩 만들어 public static final 필드로 공개
- 열거 타입은 싱글턴을 일반화한 형태
- 타입 안전성을 제공
가장 단순한 열거 타입
public enum Apple { FUJI, PIPPIN, GRANNY_SMITH }
데이터와 메서드를 갖는 열거 타입
public enum Planet {
MERCURY(3.302e+23, 2.439e6),
VENUS(4.869e+24, 6.052e6);
private final double mass;
private final double radius;
private final double sum;
Planet(double mass, double radius) {
this.mass = mass;
this.radius = radius;
this.sum = mass + radius;
}
public mass() { return mass; }
public radius() { return radius; }
public surfaceGravity() { return surfaceGravity; }
}
상수별 메서드 구현을 활용한 열거 타입
public enum Operation {
PLUS {public double apply(double x, double y) {return x + y;}},
MINUS {public double apply(double x, double y) {return x - y;}};
public abstract double apply(double x, double y);
}
상수별 클래스 몸체(class body)와 데이터를 사용한 열거 타입
public enum Operation {
PLUS("+") {public double apply(double x, double y) {return x + y;}},
MINUS("-") {public double apply(double x, double y) {return x - y;}};
private final String symbol;
Operation(String symbol) { this.symbol = symbol; }
public abstract double apply(double x, double y);
}
열거 타입용 fromString 메서드 구현하기
```java private static final Map<String, Operation> stringToEnum = Stream.of(values()).collect(toMap(Object::toString, e -> e));
// 지정한 문자열에 해당하는 Operation을 (존재한다면) 반환한다.
public statc Opional
정리
- 필요한 원소를 컴파일타임에 알 수 있는 상수 집합이라면 항상 열거 타입을 사용
- 열거 타입에 정의된 상수 개수가 불변일 필요는 없다