JAVA/Effective Java
item 35. ordinal 메서드 대신 인스턴스 필드를 사용하라
Garonguri
2022. 5. 31. 15:37
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