본문 바로가기

Reading/Effective Java

[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. 이미 사용중인 정수와 값이 같은 상수를 추가할 수 없다(ex 8명이 연주하는 또다른 이름이 있다면? 이미 있기에 추가 불가)

3. 값을 중간에 비워둘 수 없다.(ex 30명이 연주하는 이름이 온다면? 11~29까지 더미 상수를 추가 필요. 실용성 하락)

 

 

해결책: 열거 타입 상수에 연결된 값은 인스턴스 필드에 저장


 

public enum Ensemble {
    SOLO(1), DUET(2), TRIO(3), QUARTET(4), QUINTET(5),
    SEXTET(6), SEPTET(7), OCTET(8), DOUBLE_QUARTET(8),
    NONET(9), DECTET(10), TRIPLE_QUARTET(12);
    private final int numberOfMusicians;
    Ensemble(int size) { this.numberOfMusicians = size; }
    public int numberOfMusicians() { return numberOfMusicians; }
}

 

Enum의 API 문서에도 ordinal은 아래와 같이 명시되어있다. 따라서 ordinal을 연결된 정수값으로 사용하지 말자.

"대부분 프로그래머는 이 메소드를 쓸 일 없다. EnumSet, EnumMap 같은 열거 타입 기반 범용 자료구조에 쓸 목적으로 설계되었다"

 

 

 

* 위 글은 EffectiveJava 3/E 책 내용을 정리한 글로, 저작권 관련 문제가 있다면 댓글로 남겨주시면 즉각 삭제조치 하겠습니다.