728x90
ordinal => 해당 상수가 열거타입에서 몇 번째 위치인지를 반환하는 메서드
/*
연주자가 1명(SOLO) ~ 10aud (DECTET)를 표현한 열거 타입
*/
public enum Ensemble {
SOLO, DUET, TRIO , QUARTET, QUINTET ,
SEXTET, SEPTET, OCTET, NONET, DECTET;
public int numberOfMusicians(){
return ordinal() + 1;
}
}
ordinal 메서드의 문제점
- 상수 선언 순서에 의존성을 가지게됨
=> 상수 선언 순서를 바꿀 경우 numberOfMusicians는 오동작함(순서에 의존성을 가짐), 값이 같은 상수는 추가할 방법이 없음 (8중추가 이미 있으므로, 복4중주(DOUBLE_QUARTET 는 추가 불가능)
- '값을 중간에 비워둘수 없음
=> 12중주를 추가혀려면 반드시 11중주또한 추가해야함.
해결책
- ordinal 대신 인스턴스 필드에 값을 저장한다.
/*
연주자가 1명(SOLO) ~ 10aud (DECTET)를 표현한 열거 타입
*/
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(12), TRIPLE_QUARTET(12);
private final int numberOfMusicians;
/*생성자, getter..*/
}
Enum api의 ordinal 명세
public final int ordinal()
Returns the ordinal of this enumeration constant (its position in its enum declaration, where the initial constant is assigned an ordinal of zero). Most programmers will have no use for this method. It is designed for use by sophisticated enum-based data structures, such as EnumSet and EnumMap.
'JAVA > Effective Java' 카테고리의 다른 글
item 64) 객체는 인터페이스를 사용해 참조하라. (0) | 2021.02.07 |
---|---|
item 36) 비트 필드 대신 EnumSet을 사용하라 (0) | 2021.02.06 |
item28) 배열보다는 리스트를 사용하라 (0) | 2021.01.31 |
item 27) 비검사 경고를 제거하라 (0) | 2021.01.22 |
item 24) 멤버 클래스는 되도록 static으로 만들라 (0) | 2021.01.17 |