37. ordinal 인덱싱 대신 EnumMap 을 사용하라
배열 인덱스를 얻기 위한 방법
- ordinal X → EnumMap
다차원 관계 → EnumMap<..., EnumMap<...>>
애플리케이션 프로그래머는 Enum.ordinal 을 웬만해서는 사용하지 말아야 한다.[35]
#
배열 인덱스를 얻기 위한 방법식물을 생애주기별로 총 3개의 집합을 만들어 보자.
#
ordinal() → 🅧#
EnumMap열거 타입을 키로 사용하도록 설계한 아주 빠른 Map 구현체
- 짧고 명료함
- 맵의 키인 열거 타입 그 자체로 출력용 문자열을 제공하여 레이블이 필요 없음
- 안전함
- 형변환을 쓰지 않는다.
- 성능도 ordinal 과 비견된다.
- EnumMap 내부에서 배열을 사용하기 때문
#
스트림을 사용한 Map 코드 1생애주기에 속하는 식물이 있을 때만 맵을 만든다.
EnumMap 이 아닌 고유한 맵 구현체를 사용
- EnumMap 의 공간 성능 이점이 사라짐
Collectors.groupingBy 메서드
- mapFactory 매개변수에 원하는 맵 구현체를 명시해 호출 할 수 있다.
#
스트림 + EnumMap : 데이터와 열거타입의 매핑식물의 생애주기 당 하나씩의 중첩 맵을 만든다.
#
다차원 관계 : 데이터와 열거 타입쌍의 연결한 상태에서 다른 상태로의 전이를 반환하는 프로그램을 만들어보자
#
안좋은 예: ordinal- 컴파일러는 ordinal 과 배열 인덱스의 관계를 모른다.
- Phase 나, Phase.Transition 열거 타입을 수정하면 표 TRANSITIONS 를 함께 수정하지 않거나 잘 못 수정하면 런타임 오류 발생
- ArrayIndexOutOfBoundsException, NullPointerException 을 던질 수 있다.
- 상태가지수가 늘어나면 제곱해서 null 칸도 증가한다.
#
중첩 EnumMap 데이터와 열거 타입쌍의 연결새로운 상태 추가하기