JAVA/Effective Java

[아이템 35] ordinal 메서드 대신 인스턴스 필드를 사용하라

꾸준함. 2024. 2. 26. 07:30

대부분의 열거 타입 상수는 자연스럽게 하나의 정수값에 대응되며 모든 Enum 타입은 해당 상수가 그 열거 타입에서 몇 번째 위치인지를 반환하는 ordinal() 메서드를 제공합니다.

그러나 ordinal()은 대부분의 개발자가 사용할 일이 없는 메서드로, EnumSet과 EnumMap과 같이 열거 타입 기반의 범용 자료구조를 구현하지 않는 이상 사용을 피해야 합니다.

 

ordinal을 잘 못 사용한 예

다음 코드는 합주단의 종류를 연주자가 1명인 솔로부터 10명인 디텍트까지 정의한 Enum 타입입니다.


 

위 코드는 동작하지만 유지보수 측면에서는 끔찍한 코드입니다.

  • 상수 선언 순서를 바꾸는 순간 numberOfMusicians() 메서드가 오동작
  • 이미 사용 중인 정수와 같이 같은 상수는 추가할 방법 없음
    • ex) 8중주를 표현하는 OCTET 상수가 이미 있으므로 똑같이 8명이 연주하는 복4중주 추가 불가능

 

  • 값을 중간에 비워둘 수 없음
    • 12명이 연주하는 3중 4중주를 추가한다고 가정했을 때
    • 11명으로 구성된 연주가 없는데도 불구하고 12를 표현하기 위해 dummy 상수를 추가해야 함

 

해결책

해결책은 간단합니다.

ordinal() 메서드를 사용하는 대신 인스턴스 필드를 사용하면 됩니다.


 

정리

ordinal() 메서드를 사용할 경우 전체적으로 코드가 깔끔하지 못할 뿐 아니라 쓰이지 않는 dummy 상수가 많아져 실용성이 떨어집니다.

ordinal() 메서드는 열거 타입 기반의 범용 자료구조를 구현하지 않는 이상 사용을 피해야 합니다.

 

 

참고

이펙티브 자바

반응형