item 37 : ordinal 인덱싱 대신 EnumMap을 사용하라
1. ordinal() 을 배열 인덱스로 이용한 예제
1) 비트 필드 및 ordinal() 방식의 주요 문제점
ordinal() 방식의 주요 문제점class Plant {
enum LifeCycle {ANNUAL, PERENNIAL, BIENNIAL}
final String name;
final LifeCycle lifeCycle;
Plant(String name, LifeCycle lifeCycle) {
this.name = name;
this.lifeCycle = lifeCycle;
}
@Override public String toString() { return name; }
}
// 문제 코드: 생애주기별 식물을 배열로 관리하는 코드
@Test
public void plantsByLifeCycleTest() {
Set<Plant>[] plantsByLifeCycle = (Set<Plant>[]) new Set[Plant.LifeCycle.values().length];
List<Plant> garden = new ArrayList<>(List.of(
new Plant("A", Plant.LifeCycle.ANNUAL),
new Plant("B", Plant.LifeCycle.PERENNIAL),
new Plant("C", Plant.LifeCycle.BIENNIAL),
new Plant("D", Plant.LifeCycle.ANNUAL)
));
for (int i = 0; i < plantsByLifeCycle.length; i++) {
plantsByLifeCycle[i] = new HashSet<>();
}
for (Plant plant : garden) {
plantsByLifeCycle[plant.lifeCycle.ordinal()].add(plant);
}
for (int i = 0; i < plantsByLifeCycle.length; i++) {
System.out.printf("%s: %s%n", Plant.LifeCycle.values()[i], plantsByLifeCycle[i]);
}
}2. EnumMap을 사용한 대안
2. EnumMap을 사용한 대안3. 스트림과 EnumMap을 함께 사용하는 방식
EnumMap을 함께 사용하는 방식1) 스트림과 EnumMap을 사용한 코드 예제
EnumMap을 사용한 코드 예제 4. 상태 전이 관리에 중첩된 EnumMap 사용하기
EnumMap 사용하기1) ordinal()을 이용한 2차원 배열 인덱스 예제
ordinal()을 이용한 2차원 배열 인덱스 예제2) EnumMap을 사용한 개선 예제
핵심 정리
Last updated