-
[Effective Java] 아이템35: ordinal 메서드 대신 인스턴스 필드를 사용하라Language/Java 2022. 8. 15. 12:01
✔️ ordinal 메서드란?
대부분의 열거 타입 상수는 하나의 정숫값에 대응된다.
그리고 모든 열거 타입은 해당 상수가 그 열거 타입에서 몇 번째 위치인지를 반환하는 메서드를 제공하는데, 이 메서드가
ordinal
메서드다.✔️ ordinal의 잘못된 사용
언뜻 보면 굉장히 편리한 메서드처럼 보이고, 이 메서드를 이용하고 싶은 유혹에 빠지기 쉽다.
하지만 아이템 이름에서도 알 수 있듯이 사용하지 않는 것이 좋다.
연주자가 1명인 솔로(solo)부터 10명인 디텍트(dectet)까지 정의한 열거 타입 예제를 보자.
public enum Ensemble { SOLO, DUET, TRIO, QUARTET, QUINTET, SEXTET, SEPTET, OCTET, NONET, DECTET; public int numberOfMusicians() { return ordinal() + 1; } }
동작은 하지만 끔찍한 코드다.
- 상수 선언 순서를 바꾸는 순간 numberOfMusicians 가 오동작한다.
- 이미 사용 중인 정수와 값이 같은 상수는 추가할 방법이 없다.
예를 들어, 8중주(octet) 상수가 이미 있기 때문에 똑같이 8명이 연주하는 복4중주(double quartet)는 추가할 수 없다. - 중간에 값을 비워둘 수도 없다.
예를 들어, 12명이 연주하는 3중 4중주(triple quartet)를 추가한다고 해보자. 그러려면 중간에 11명짜리 상수도 채워야 하는데 11명으로 구성된 연주를 일컫는 이름이 없기 때문에 더미(dummy) 상수를 같이 추가해야만 한다.
Enum의 API 문서를 보면 ordinal에 대해 이렇게 쓰여 있다.
“대부분의 프로그래머는 이 메서드를 쓸 일이 없다. 이 메서드는 EnumSet과 EnumMap과 같이 열거 타입 기반의 범용 자료구조에 쓸 목적으로 설계되었다.”
따라서, 이런 용도가 아니라면 ordinal 메서드는 절대 사용하지 말자.
✔️ 인스턴스 필드 사용
그렇다면 ordinal 메서드를 사용하고 numberOfMusicians를 구현하는 방법은 무엇일까?
그것은 바로 열거 타입 상수에 연결된 값을 인스턴스 필드에 저장하는 것이다.
public enum Ensemble { SOLO(1), DUET(2), TRIO(3), QUARTET(4), QUINTET(5), SEXTET(6), SEPTET(7), OCTET(8), DOUBLE_QUARTET(8), NONET(9), DECTET(10), TRIPLE_QUARTET(12); private final int numberOfMusicians; Ensemble(int size) { this.numberOfMusicians = size; } public int numberOfMusicians() { return numberOfMusicians; } }
numberOfMusicians 인스턴스에 연주자의 인원 수를 저장하면, 같은 값을 갖는 상수가 존재해도 되고(OCTET, DOUBLE_QUARTET), 중간에 빈 값(11)이 있어도 된다.
728x90'Language > Java' 카테고리의 다른 글
[Effective Java] 아이템34: int 상수 대신 열거 타입을 사용하라 (0) 2022.08.11 [Effective Java] 아이템33: 타입 안전 이종 컨테이너를 고려하라 (0) 2022.08.10 [Effective Java] 아이템32: 제네릭과 가변인수를 함께 쓸 때는 신중하라 (0) 2022.08.09 [Effective Java] 아이템31: 한정적 와일드카드를 사용해 API 유연성을 높이라 (0) 2022.08.06 [Effective Java] 아이템30: 이왕이면 제네릭 메서드로 만들라 (0) 2022.08.06