맞는데 왜 틀릴까..?

Java/Effective Java

[Effective Java] Item 35. ordinal 메서드 대신 인스턴스 필드를 사용하라

안도일 2023. 5. 16. 16:19

가뭄에 단비 같은 아이템이구나..

 

대부분의 열거 타입 상수는 자연스럽게 하나의 정숫값에 대응된다.

모든 열거 타입은 해당 상수가 그 열거 타입에서 몇 번째 위치인지를 반환하는 ordinal 메서드를 제공한다.

이런 이유로 열거 타입 상수와 연결된 정숫값이 필요하면 ordinal 메서드를 이용하고 싶은 생각이 들 수 있다.

 

하지만 ordinal 메서드는 많은 단점이 있다.

 

합주단 종류를 연주자가 1명인 SOLO 부터 10명인 DECTET까지 정의한 열거 타입

 

 

  • 동작은 하지만 유지보수하기 힘들다.
  • 상수 선언 순서를 바꾸면 numberOfMusicians가 오작동한다.
  • 이미 사용 중인 정수와 값이 같은 상수는 추가할 수 없다. (8중주가 이미 있으므로 똑같이 8명이 연주하는 복4중주는 추가할 수 없다.)
  • 값을 중간에 비워둘 수 없다. (해당 공간에 더미 상수를 추가해야 한다.)

 

많은 단점이 있으니 사용하지 말고 아래와 같이 간단한 방법을 사용하자.

 

 

열거 타입 상수에 연결된 값은 ordinal 메서드로 얻지 말고, 인스턴스 필드에 저장하자.

 

 

  • Enum의 API 문서에 조차 대부분 ordinal 메서드를 쓸 일이 없다고 적혀있다.
  • EnumSet과 EnumMap 같이 열거 타입 기반 범용 자료구조로 설계되었으므로 이런 용도가 아니라면 ordinal 메서드는 사용하지 말자!