반응형
이 포스팅에서 작성하는 내용은 EFFECTIVE JAVA(이펙티브자바) 에서 발췌하였습니다.
아이템 35. ordinal 메서드 대신 인스턴스 필드를 사용하라
ordinal 메서드
- 대부분의 열거 타입 상수는 자연스럽게 하나의 정숫값에 대응된다.
- 모든 열거 타입은 해당 상수가 그 열거 타입에서 몇 번째인지 위치를 반환하는 ordinal 메서드를 제공한다.
- 위의 이유로 열거 타입 상수와 연결된 정숫값이 필요하면 ordinal 메서드를 이용할 수 있는데 결론적으로 이는 위험하다.
ex1) ordinal을 잘못 사용한 코드
public enum Ensemble {
SOLO, DUET, TRIO, QUARTET, QUINTET,
SEXTET, SEPTET, OCTET, NONET, DECTET;
public int numberOfMusicians() {
return ordinal() + 1;
}
}
- 합주단의 종류를 연주자가 1명인 SOLO부터 10명인 DECTET까지 정의한 열거 타입이다.
- 상수 선언 순서를 변경하면 numberOfMusicians가 오작동하며, 이미 사용 중인 정수와 값이 같은 상수는 추가할 방법이 없다. ex) 8중주 상수가 이미 있으니 똑같이 8명이 연주하는 복4중주는 추가할 수 없다.
- 값을 중간에 비워둘 수도 없다. 12명이 연주하는 3중 4중주를 추가한다고 해보면 중간에 11명짜리 상수도 채워야 하는데, 11명으로 구성된 연주를 일컫는 말은 없다.
- 열거 타입 상수에 연결된 값은 ordinal 메서드로 얻지 말고, 인스턴스 필드에 저장해야 한다.
ex 2) ordinal을 사용하지 않는 좋은 예
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에 대해 “대부분 프로그래머는 이 메서드를 쓸 일이 없고, EnumSet과 EnumMap 같이 열거 타입 기반의 범용 자료구조에 쓸 목적으로 설계되었다.”라고 한다.
- 위의 용도가 아니라면 절대 사용하지 말자.
반응형
'BE > Java' 카테고리의 다른 글
[Effective Java] 아이템 37. ordinal 인덱싱 대신 EnumMap을 사용하라 (1) | 2022.10.25 |
---|---|
[Effective Java] 아이템 36. 비트 필드 대신 EnumSet을 사용하라 (0) | 2022.10.24 |
[Effective Java] 34. int 상수 대신 열거 타입을 사용하라 (0) | 2022.10.21 |
[Effective Java] 33. 타입 안전 이종 컨테이너를 고려하라 (0) | 2022.10.19 |
[Effective Java] 아이템 32. 제네릭과 가변인수를 함께 쓸 때는 신중하라 (1) | 2022.10.18 |