-
Notifications
You must be signed in to change notification settings - Fork 1
item 35 leekyunghee
leekyunghee edited this page Apr 17, 2020
·
6 revisions
- 열거 타입 상수는 하나의 정숫값에 대응된다.
- 열거 타입은 해당 상수가 그 열거 타입에서 몇번째 위치인지 반환하는 ordinal 메서드를 제공한다.
- 열거 타입 상수와 연결된 정숫값이 필요하면 ordinal 메서드를 이용하고 싶을 경우가 있다.
3가지 단점이 발생
- 중간의 값을 넣을 경우 기존 동작 소스가 꼬이게 된다.
- null 값을 넣을 수 없다.
- 중복된 자릿수를 가질 수 있을 때 쓸 수 없다.
// ordinal을 잘못 사용한 예 - 따라하지 말것.
public enum Ensemble {
SOLO, DUET, TRIO, QUARTET, QUINTET,
SEXTET, SEPTET, OCTET, NONET, DECTET;
public int numberOfMusicians() { return ordinal() + 1; }
}
열거 타입 상수에 연결된 값은 ordinal 메서드로 얻지 말고 인스턴스 필드에 저장하자.
위치가 아닌 값이 되며 인스턴스 필드를 써서 생성자를 이용해 enum에 값을 넣는다.
// 인스턴스 필드에 정수 데이터를 저장하는 열거 타입 (222쪽)
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;
}
}
핵심 정리
EnumSet 과 EnumMap 같이 열거 타입 기반의 범용 자료구조를 쓸 목적이 아니라면
ordinal 메서드는 사용하지 말자.