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

Enum type의 ordinal method

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* 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내에서 몇번쨰 위치하고 있는지 알아낼때 사용한다.

1
2
3
4
5
6
7
8
9
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 대신에 위치값을 멤버 필드로 가지고 반환하자.

1
2
3
4
5
6
7
8
9
10
11
12
13
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;
}
}

Comments