반응형

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

자바 열거 타입에서는 몇 번째 위치를 반환하는 ordinal 메서드를 제공한다.

EnumSet 이나 EnumMap 과 같이 열거 타입 기반의 자료구조에서 사용하려고 만든 메서드이다. 하지만 이 메서드를 프로그래머가 임의의 메서드에서 사용한다면 오동작할 수 있다.

 

public enum Ensemble {
	SOLO, DUET, TRIO, QUARTET, QUINTET,
    SEXTET, SEPTET, OCTET, NONET, DECTET;
	
    // 아래처럼 사용하면 안 된다.
    public int numberOfMusicians() { return ordinal() + 1; }
}

 

상수 선언 순서를 바꾸는 순간 오동작하는 코드이며, 이미 사용 중인 정수와 값이 같은 상수라면 추가할 방법이 없다.

값을 중간에 비워둘 수도 없다. 차라리 아래와 같이 선언과 동시에 인스턴스 필드에 저장하면 된다.

 

public enum Ensemble {
	SOLO(1), DUET(2), TRIO(3), QUARTET(4), QUINTET(5),
    SEXTET(6), SEPTET(7), OCTET(8), NONET(9), DECTET(10);
	
    private final int numberOfMusicians;
    Ensemble(int size) { this.numberOfMusicians = size; }
    public int numberOfMusicians() { return nubmerOfMusicians; }
}
반응형

+ Recent posts