-
Item 35. ordinal 메서드 대신 인스턴스 필드를 사용하라Book/Effective Java 3E 2022. 12. 29. 21:00반응형
모든 열거 타입은 해당 상수가 그 열거 타입에서 몇 번째 위치인지를 반환하는 ordinal이라는 메서드를 제공합니다. 다음 코드는 합주단의 종류를 연주자가 1명인 솔로(solo)부터 10명인 디텍트(dectet)까지 정의한 열거 타입입니다.
public enum Ensemble { SOLO, DUET, TRIO, QUARTET, QUINTET, SEXTET, SEPTET, OCTET, NONET, DECTET; public int numberOfMusicians() { return ordinal() + 1; } }
동작은 하지만 유지보수하기가 끔찍한 코드입니다. 상수 선언 순서를 바꾸는 순간 numberOfMusicians가 오동작하며, 이미 사용 중인 정수와 값이 같은 상수는 추가할 방법이 없습니다. 또한, 값을 중간에 비워둘 수도 없습니다.
해결책은 열거 타입 상수에 연결된 값은 ordinal 메서드로 얻지 말고, 인스턴스 필드에 저장합니다.
package effectivejava.chapter6.item35; // 인스턴스 필드에 정수 데이터를 저장하는 열거 타입 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 같이 열거 타입 기반의 범용 자료구조에 쓸 목적으로 설계되었다."
[참고 정보]
이펙티브 자바 Effective Java 3/E 도서 [조슈아 블로크 저]
반응형'Book > Effective Java 3E' 카테고리의 다른 글
Item 37. ordinal 인덱싱 대신 EnumMap을 사용하라 (0) 2023.02.24 Item 36. 비트 필드 대신 EnumSet을 사용하라 (0) 2023.02.18 Item 34. int 상수 대신 열거 타입을 사용하라 (0) 2022.12.28 Item 33. 타입 안전 이종 컨테이너를 고려하라 (1) 2022.12.23 Item 32. 제네릭과 가변인수를 함께 쓸 때는 신중하라 (0) 2022.12.20