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

Jimin Lim·2022년 11월 10일
0

Effective Java

목록 보기
25/38
post-thumbnail

아이템 35

ordinal 메서드 대신 인스턴스 필드를 사용하라

✅ Ordinal 이란

  • ordinal: 열거 타입에서 몇 번째 위치인지를 반환하는 메서드

대부분의 열거 타입 상수는 자연스럽게 하나의 정숫값에 대응된다. 그리고 모든 열거 타입은 ordinal이라는 메서드를 제공한다.
따라서 열거 타입 상수와 연결된 정숫값이 필요하다면 ordinal을 사용하곤 하는데 이 방법은 추천하지 않는 방법이다.

✅ 문제점

예를 들어, 다음과 같이 합주단의 종류를 연주자가 한명인 SOLO부터 10명인 DECTEC까지 정의한 열거 타입이 있다.

public enum Ensemble {
    SOLO, DUET, TRIO, QUARTET, QUINTET, SEXTET, SEPTET, OCTET, NONET, DECTET;

    public int numberOfMusicians() {
        return ordinal() + 1;
    }
}

만약 위 방식처럼 사용한다면

  1. 상수 선언 순서를 바꾼다면 numberOfMusicians가 오작동하게 된다.
  2. 이미 사용 중인 정수와 값이 같은 상수는 추가할 방법이 없다.
  3. 값을 중간에 비워둘 수 없다.
    예를 들어 12명이 연주하는 상수를 추가한다면 11명이 연주하는 상수는 비게 된다. 따라서 11명짜리 상수를 쓰이지 않는 더미를 끼우게 된다.

✅ 해결책

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

실제로 ordinal은 EnumSet, EnumMap과 같이 열거 타입 기반의 범용 자료구조에 쓸 목적으로 설계되었다고 한다. 따라서 이러한 용도가 아니면 ordinal을 사용하지 말자.

profile
💻 ☕️ 🏝 🍑 🍹 🏊‍♀️

0개의 댓글