enum 타입이 등장하기 전에는 정수 열거 패턴(int enum pattern) 을 사용했었다.
public static final int APPLE_FUJI = 0;
public static final int APPLE_PIPPIN = 1;
public static final int ORANGE_NEVEL = 0;
public static final int ORANGE_TEMPLE = 1
But, 정수 열거 패턴 상수가 타입에 안전하지 않고, 코드가 길어지는 문제점이 있다.
또한 이펙티브 자바 아이템 35에서, ordinal 메서드 대신 인스턴스 필드를 사용하라 -> 왜? 상수의 선언을 바꾸는 순간 바로 오동작을 할 수 있으며, 이미 사용 중인 정수와 값이 같은 상수는 추가할 수도 없기 때문이라고 나와 있음
public enum Ensemble {
SOLO(1), DUET(2), TRIO(3), QUARTET(4), QUINTET(5),
SEXTET(6), SEPTET(7), OCTET(8), NONET(9), DECTET(10),
DOUBLE_QUARTET(8), TRIPLE_QUARTET(12);
private final int int numberOfMusicians;
Ensemble(int size) { this.numberOfMusicians = size; }
public int numberOfMusicians() { return numberOfMusicians; }
}
그래서 내 프로젝트에서 여러 클래스의 상수를 Enum 클래스에서 관리하기로 결정했다.
// domain/ottNames.enum
package com.ott.ott_server.domain.enums;
public enum OttNames {
NETFLIX("NETFLIX"),
TVING("TVING"),
WATCHA("WATCHAPLAY"),
WAVVE("WAVVE");
private final String value;
OttNames(String value){
this.value = value;
}
public String value() {
return value;
}
}
이런 식으로 OttNames Enum 클래스를 제작하여, 인스턴스 필드에 값을 넣어 value로 반환하는 식으로 변경!
// ReviewService.class
private void checkSubscribe(MovieRequestData movieRequestData, Movie movie) {
if (movieRequestData.getMovieOttRequestData().isNetflix()) {
Ott ott = findIdByOttName(OttNames.NETFLIX.value());
setMovieOtt(movie, ott);
}
if (movieRequestData.getMovieOttRequestData().isTving()) {
Ott ott = findIdByOttName(OttNames.TVING.value());
setMovieOtt(movie, ott);
}
if (movieRequestData.getMovieOttRequestData().isWatcha()) {
Ott ott = findIdByOttName(OttNames.WATCHA.value());
setMovieOtt(movie, ott);
}
if (movieRequestData.getMovieOttRequestData().isWavve()) {
Ott ott = findIdByOttName(OttNames.WAVVE.value());
setMovieOtt(movie, ott);
}
}
각 OTT별 문자열이 필요할 때, enums를 통해 불러온다!