[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 fromString(Stirng symbol) { return Optional.ofNullale(stringToEnum.get(symbol)); }

정리

  • 필요한 원소를 컴파일타임에 알 수 있는 상수 집합이라면 항상 열거 타입을 사용
  • 열거 타입에 정의된 상수 개수가 불변일 필요는 없다