티스토리 뷰
728x90
반응형
ordinal 메서드 대신 인스턴스 필드를 사용하라
🧨 ordinal 메서드의 문제
- Enum은 0부터 인덱스가 시작하며, 그렇기 때문에 예제코드에서 + 1를 해주고 있습니다.
- 상수 선언의 순서를 바꾸는 순간 개발자가 의도하지 않은 쪽으로 흘러갈 수 있습니다. 예를들어 DB에 해당 Enum을 ordinal로 저장 시 추후에 순서가 변경된다면 기존 DB에 저장되어 있는 순서와 일치하지 않으니 문제가 발생할 수 있습니다.
- 또한 중간에 값을 비울 수 없습니다.
public enum Ensemble {
SOLO, DUET, TRIO, QUARTET,
QUINTET, SEXTET, SEPTET,
OCTET, NONET, DECTET;
public int numberOfMusicians() {
return ordinal() + 1;
}
}
public class EffectiveJavaApplication {
public static void main(String[] args) throws Exception {
for(Ensemble item : Ensemble.values()) {
System.out.println(item.numberOfMusicians()); // 1 ~ 10까지 출력됨
}
}
}
💡 해결책
- 해결책으로는 ordinal을 사용하지 않고 연결된 데이터 값은 ordinal 메서드가 아닌 인스턴스 필드에 저장을 합니다. 그렇게 되면 중간에 값을 비울 수 있으며 유연하게 사용할 수 있습니다.
public enum Ensemble {
SOLO(1), DUET(2), TRIO(3), QUARTET(4),
QUINTET(5), SEXTET(6), SEPTET(7),
OCTET(8), NONET(9), DECTET(10), TRIPLE_QUARTET(12);
private final int numberOfMusicians;
Ensemble(int numberOfMusicians) {
this.numberOfMusicians = numberOfMusicians;
}
public int getNumberOfMusicians() {
return numberOfMusicians;
}
}
public class EffectiveJavaApplication {
public static void main(String[] args) throws Exception {
for(Ensemble item : Ensemble.values()) {
System.out.println(item.getNumberOfMusicians()); // 1 ~ 12까지 출력됨, 11은 없으니 생략
}
}
}
💡 Enum API 문서 중 일부
- "대부분의 프로그래머는 이 메서드를 쓸 일어 없다. 이 메서드는 EnumSet과 EnumMap 같이 열거 타입 기반의 범용 자료구제에 쓸 목적으로 설계되었다" 라고 적혀 있습니다.
728x90
반응형
'스터디 > 이펙티브 자바' 카테고리의 다른 글
이펙티브 자바 - Item38. 확장할 수 있는 열거 타입이 필요하면 인터페이스를 사용하라. (0) | 2022.07.27 |
---|---|
이펙티브 자바 - Item36. 비트 필드 대신 EnumSet을 사용하라. (0) | 2022.07.25 |
이펙티브 자바 - Item34. int 상수대신 열거 타입을 사용하라. (0) | 2022.07.24 |
이펙티브 자바 - Item33. 타입 안전 이종 컨테이노를 고려하라. (0) | 2022.07.23 |
이펙티브 자바 - Item32. 제네릭과 가변인수를 함께 쓸 때는 신중하라. (0) | 2022.07.23 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- JDK Dynamic Proxy와 CGLIB의 차이
- 트랜잭셔널 아웃박스 패턴 스프링부트
- spring boot redisson sorted set
- spring boot redis 대기열 구현
- pipe and filter architecture
- transactional outbox pattern
- redis sorted set으로 대기열 구현
- spring boot excel download oom
- java ThreadLocal
- 서비스 기반 아키텍처
- spring boot 엑셀 다운로드
- 레이어드 아키텍처란
- 람다 표현식
- transactional outbox pattern spring boot
- pipeline architecture
- microkernel architecture
- space based architecture
- service based architecture
- redis 대기열 구현
- 자바 백엔드 개발자 추천 도서
- 공간 기반 아키텍처
- spring boot redisson destributed lock
- spring boot poi excel download
- java userThread와 DaemonThread
- spring boot redisson 분산락 구현
- @ControllerAdvice
- spring boot excel download paging
- polling publisher spring boot
- 트랜잭셔널 아웃박스 패턴 스프링 부트 예제
- redis sorted set
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함