728x90
ordinal method가 뭘까?
- 해당 상수가 그 열거 타입에서 몇 번째 위치인지를 반환해주는 메서드. (모든 열거 타입이 이를 제공한다.)
// 앙상블 종류를 1명 앙상블부터 10명 앙상블까지 정의한 열거 타입.
public enum Ensemble {
SOLO, DUET, TRIO, QUARTET, QUINTET,
SEXTET, SETPTET, OCTET, NONET, DECTET;
public int numberOfMusicians() { return ordinal() + 1; } "이렇게 쓰면 망하는 지름길"
}
왜 이렇게 쓰면 안될까?
- 상수 선언 순서를 바꾸는 순간 위 numberOfMusicians()는 제대로 동작하지 않는다.
- 이미 사용 중인 정수와 값이 같은 상수는 추가할 수 없다.
- 값을 중간에 비워둘 수 없다.
- dummy 상수를 많이 추가해야 하는 상황이 생길 수 있으며 이는 코드를 지저분하게 만든다.
그럼 우짜라구?
열거 타입 상수에 연결된 값은 ordinal 메소드가 아닌 인스턴스 필드를 사용해 연결해라.
아래와 같은 방법을 사용하여 연결하면 된다.
public enum Ensemble {
SOLO(1), DUET(2), TRIO(3), QUARTET(4), QUINTET(5),
SEXTET(6), SETPTET(7), OCTET(8), NONET(9), DECTET(10);
private final int numberOfMusicians;
Ensemble(int size) { this.numberOfMusicians = size }
public int numberOfMusicians() { return numberOfMusicians }
}
ordinal method는 프로그래머 쓰라고 만들어놓은 메서드가 아니라고 한다.
열거 타입 기반의 범용 자료구조에 쓸 목적이 아니라면 위 메소드의 존재를 잊어버리는 것이 좋을 것 같다.
728x90
'JAVA > Effective Java' 카테고리의 다른 글
item 37. ordinal 인덱싱 대신 EnumMap을 사용하라 (0) | 2022.06.03 |
---|---|
item 36. 비트 필드 대신 EnumSet을 사용하라 (0) | 2022.05.31 |
item 34. 상수 대신 열거 타입을 사용하라 (0) | 2022.05.31 |
item 33. 타입 안전 이종 컨테이너를 고려하라. (0) | 2022.05.17 |
item 31. 한정적 와일드카드를 사용해 API 유연성을 높여라. (0) | 2022.05.17 |
댓글