가뭄에 단비 같은 아이템이구나..
대부분의 열거 타입 상수는 자연스럽게 하나의 정숫값에 대응된다.
모든 열거 타입은 해당 상수가 그 열거 타입에서 몇 번째 위치인지를 반환하는 ordinal 메서드를 제공한다.
이런 이유로 열거 타입 상수와 연결된 정숫값이 필요하면 ordinal 메서드를 이용하고 싶은 생각이 들 수 있다.
하지만 ordinal 메서드는 많은 단점이 있다.
합주단 종류를 연주자가 1명인 SOLO 부터 10명인 DECTET까지 정의한 열거 타입
- 동작은 하지만 유지보수하기 힘들다.
- 상수 선언 순서를 바꾸면 numberOfMusicians가 오작동한다.
- 이미 사용 중인 정수와 값이 같은 상수는 추가할 수 없다. (8중주가 이미 있으므로 똑같이 8명이 연주하는 복4중주는 추가할 수 없다.)
- 값을 중간에 비워둘 수 없다. (해당 공간에 더미 상수를 추가해야 한다.)
많은 단점이 있으니 사용하지 말고 아래와 같이 간단한 방법을 사용하자.
열거 타입 상수에 연결된 값은 ordinal 메서드로 얻지 말고, 인스턴스 필드에 저장하자.
- Enum의 API 문서에 조차 대부분 ordinal 메서드를 쓸 일이 없다고 적혀있다.
- EnumSet과 EnumMap 같이 열거 타입 기반 범용 자료구조로 설계되었으므로 이런 용도가 아니라면 ordinal 메서드는 사용하지 말자!
'Java > Effective Java' 카테고리의 다른 글
[Effective Java] Item 37. ordinal 인덱싱 대신 EnumMap을 사용하라 (0) | 2023.06.29 |
---|---|
[Effective Java] Item 36. 비트 필드 대신 EnumSet을 사용하라 (0) | 2023.05.16 |
[Effective Java] Item 34. int 상수 대신 열거 타입을 사용하라 (0) | 2023.05.16 |
[Effective Java] Item 33. 타입 안전 이종 컨테이너를 고려하라 (0) | 2023.05.16 |
[Effective Java] Item 32. 제네릭과 가변인수를 함께 쓸 때는 신중하라 (0) | 2023.05.15 |