Item35. Enum type ordinal method 대신 member field를 사용하라

2022-01-08 15:45:07

#Java#Effective Java 3/E

Enum type의 ordinal method

/**
    * Returns the ordinal of this enumeration constant (its position
    * in its enum declaration, where the initial constant is assigned
    * an ordinal of zero).
    *
    * Most programmers will have no use for this method.  It is
    * designed for use by sophisticated enum-based data structures, such
    * as {@link java.util.EnumSet} and {@link java.util.EnumMap}.
    *
    * @return the ordinal of this enumeration constant
    */
public final int ordinal() {
    return ordinal;
}

대부분 열거타입 상수는 하나의 정수값과 대응되는데, ordinal method는 특정 상수가 그 열거타입에서 몇번쨰 위치인지를 반환하는 method이다. 예를 들면 아래와 같이 합주단 종류 enum type내에서 몇번쨰 위치하고 있는지 알아낼때 사용한다.

public enum Ensemble {

    SOLO,DUET,TRIO,QUARTET,QUINTET,
    SEXTET,SEPTET,OCTET,NONET,DECET;

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

ordinal method의 단점

  • 상수의 위치를 변경하면 해당 ordinal()출력값도 당연히 바뀐다.
  • 이미 사용중인 상수와 값이 동일한 상수는 추가할 수 없다.
  • 높은 상수 위치 값이 필요한 상황에서 값을 중간에 비워둘수가 없다. --> 중간에 dummy 상수를 추가해주어야 작동한다.

전반적으로 유지보수성이 매우 떨어진다.

ordinal method의 대체방안

해당 상수의 위치값을 활용하고 싶으면, ordinal method 대신에 위치값을 멤버 필드로 가지고 반환하자.

public enum Ensemble {

    SOLO(1),DUET(2),TRIO(3),QUARTET(4),QUINTET(5),
    SEXTET(6),SEPTET(7),OCTET(8),DOUBLE_QUARTET(8),
    NONET(9),DECET(10),TRIPLE_QUATET(12);
    private final int position;
    Ensemble(int pos){
        this.position = pos;
    }
    public int getPosition(){
        return this.position;
    }
}
프로필 이미지
@chani
바둑 좋아하는 개발자의 의미있는 학습 기록을 위한 공간입니다.

댓글

이 게시글에 대한 의견을 공유해주세요!

댓글