본문 바로가기
JAVA/Effective Java

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

by Garonguri 2022. 5. 31.
728x90

ordinal method가 뭘까?

  • 해당 상수가 그 열거 타입에서 몇 번째 위치인지를 반환해주는 메서드. (모든 열거 타입이 이를 제공한다.)
// 앙상블 종류를 1명 앙상블부터 10명 앙상블까지 정의한 열거 타입.
public enum Ensemble {
    SOLO, DUET, TRIO, QUARTET, QUINTET,
    SEXTET, SETPTET, OCTET, NONET, DECTET;

    public int numberOfMusicians() { return ordinal() + 1; } "이렇게 쓰면 망하는 지름길"
}

왜 이렇게 쓰면 안될까?

  • 상수 선언 순서를 바꾸는 순간 위 numberOfMusicians()는 제대로 동작하지 않는다.
  • 이미 사용 중인 정수와 값이 같은 상수는 추가할 수 없다.
  • 값을 중간에 비워둘 수 없다.
  • dummy 상수를 많이 추가해야 하는 상황이 생길 수 있으며 이는 코드를 지저분하게 만든다.

 

그럼 우짜라구?

열거 타입 상수에 연결된 값은 ordinal 메소드가 아닌 인스턴스 필드를 사용해 연결해라.

아래와 같은 방법을 사용하여 연결하면 된다.

public enum Ensemble {
	SOLO(1), DUET(2), TRIO(3), QUARTET(4), QUINTET(5),
	SEXTET(6), SETPTET(7), OCTET(8), NONET(9), DECTET(10);

	private final int numberOfMusicians;
	Ensemble(int size) { this.numberOfMusicians = size }
	public int numberOfMusicians() { return numberOfMusicians }
}

ordinal method는 프로그래머 쓰라고 만들어놓은 메서드가 아니라고 한다.

열거 타입 기반의 범용 자료구조에 쓸 목적이 아니라면 위 메소드의 존재를 잊어버리는 것이 좋을 것 같다.

728x90

댓글