이 글은 책 이펙티브 자바 3판 Item35와 하단 Reference 참고했습니다. 잘못된 내용이 있다면 편하게 말씀해주세요 🙏🏻
한 줄 요약
enum에서 ordinal 메서드 사용하지 말고 인스턴스 필드를 써라
enum 클래스에 기본 내장으로 ordinal() 메서드가 있다. 해당 상수가 열거 타입의 몇 번째 위치진이 반환하는 메서드이다. 아래 Esenmble enum에서 순서는 SOLO, DUET, TRIO... 순으로 oridinal()은 0, 1, 2... 순으로 결과가 나온다. numberOfMusicians() 메서드는 이 결과에 +1 하여 리턴하니 1,2,3,4,5... 순서의 값으로 나온다.
enum Esenmble {
SOLO, DUET, TRIO, QUARTET, QUINTET,
SEXTET, SETPTET, OCTET, NONET, DECTET;
public int numberOfMusicians() {
return ordinal() + 1;
}
}
하지만 이 메서드는 사용하면 안된다. 왜 그럴까?
문제점
- 열거 타입 순서를 지키면서 정의해야 한다.
- 같은 수는 여러 개 선언할 수 없다.
그렇다면 어떻게 해야 할까?
해결법
- 인스턴스 필드로 값을 지정, 저장하여 사용하자. oridinal() 메서드의 문제점을 피할 수 있다.
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 }
}
+a) oridinal() 메서드의 JDK 11 Java doc 내용
Returns the ordinal of this enumeration constant (its position in its enum declaration, where the initial constant is assigned an ordinal of zero). Most programmers will have no use for this method. It is designed for use by sophisticated enum-based data structures, such as java.util.EnumSet and java.util.EnumMap.
대부분의 프로그래머는 이 메서드를 사용하지 않는다. EnumSet이나 EnumMap에서 사용하기 위해 만들어진 메서드이다.
공식 문서에서 특별한 용도를 제외하고 사용하지 말라니 쓰지 말아야겠다.
⛓ Reference
쿠킴 - 자바의 'enum'과 'lambda'를 클래스로 이해해보기 🔎
'☕️ JAVA > 🦋 Effective Java' 카테고리의 다른 글
자바에서 객체 복사는 clone()이 아닌 복사 생성자, 팩토리를 사용하자 (0) | 2022.02.05 |
---|---|
자바의 동시성 프로그래밍, 가변 데이터를 동기화하는 3가지 방법(+a. 자바 기본 타입의 원자성에 대하여) (0) | 2022.01.24 |
자바의 'enum'과 'lambda'를 클래스로 이해해보기 🔎 (2) | 2022.01.21 |
정확한 답이 필요하다면 float와 double은 피하자 🏃♂️ (0) | 2022.01.18 |
표준 라이브러리를 익히고 사용하자 ㉿ (0) | 2022.01.18 |
댓글