이펙티브 자바 #item35 ordinal 메서드 대신 인스턴스 필드를 사용하라

임현규·2023년 2월 17일
0

이펙티브 자바

목록 보기
35/47
post-thumbnail
post-custom-banner

Ordinal()

enum을 사용하다 보면 Ordinal() 함수를 볼 수 있다. Ordinal에 대해서 살펴보면 다음과 같다.

enumeration의 ordinal(어떤 순서를 나타내는것, enum 정의의 각 포지션)를 리턴한다. 일종의 선언한 열거형 상수 인스턴스들의 인덱스 정도로 이해하면 된다.

Ordinal()대신 인스턴스 필드를 사용하자

Ordinal의 단점은 인스턴스 필드들의 순서가 바뀐다면 그 값은 신뢰하지 못할 수도 있다. 예를 들어보자.

public enum Ensemble {
	SOLO, DUET, TRIO, QUARTET, QUINTET, SEXTET, SEPTET, OCTET, NONET, DECTET;
    
    public int numberOfMusicians() {
    	return ordinal() + 1;
    }
}

위의 코드는 ordinal()이 초기 0부터 시작해서 1씩 증가하며 할당되는 특성을 이용해 구현한 것이다. 그러나 SOLO와 DUET간의 인스턴스가 바뀌거나 혹은 열거형 필드를 추가할 때 +1의 필드를 추가하는 것이 아닌 이전 필드의 +2, +3을 추가하게 될 수도 있다. 이런 경우 우리가 의도한 결과를 얻지 못할 것이다. 고로 위 코드는 확장성에서 좋지 않고 잠재적으로 논리적 오류를 일으킬 수 있는 코드이다.

인스턴스 필드를 활용하면 위의 문제는 간단히 해결된다.

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 numberOfMusicians;
    }
}

가독성도 좋고 훨씬 안전하게 활용가능하다. Ordinal은 애초에 EnumSet 또는 EnumMap과 같은 열거 타입 기반의 범용 자료구조에 쓸 목적으로 설계되었다. 그렇기 때문에 ordinal()를 사용할 이유도 없고 사용해서도 안된다. 인스턴스 필드를 적극적으로 활용하자.

profile
엘 프사이 콩그루
post-custom-banner

0개의 댓글