Closed kjsu0209 closed 3 years ago
네 저는 필요하다고 생각합니다. 단순히 정수값을 상태 표기에 썼을 때 생기는 문제를 보완해줄 뿐 아니라 개발자가 코드 작성중 하는 실수를 컴파일러단에서 잡을 수 있을 뿐 아니라 Enum의 강력한 기능 덕에 책에서 언급되었던 승급 검사를 Enum에 abstract 메서드를 이용한 선언으로 모아 관심사를 집중시킬 수 있는 등의 기능을 구현할 수 있습니다.
아래는 제가 필기하면서 Enum으로 더 깔끔하게 쓰는 방법을 고안해봤는데, 참고해보시면 좋겠습니다.
public enum Level {
BASIC(1){
public boolean isPossibleUpgrade(User user) { // 각 Enum 인스턴스에 업그레이드 조건 작성
return (user.getLogin() >= 50);
}
},
SILVER(2){
public boolean isPossibleUpgrade(User user) {
return (user.getRecommend() >= 30);
}
},
GOLD(3){
public boolean isPossibleUpgrade(User user) {
return false; // 마지막 등급의 업그레이드는 불가능하기 때문에 항상 false
}
};
private final int value;
public abstract boolean isPossibleUpgrade(User user);
Level(int value) {
this.value = value;
}
// Level.BASIC의 경우 value 필드가 1로 설정이 된다.
public int intValue() {
return value;
}
// 각 등급 Enum 인스턴스의 정수 값 반환
public static Level valueOf(int value) {
switch (value) {
case 1: return BASIC;
case 2: return SILVER;
case 3: return GOLD;
default: throw new AssertionError("Unknown value" + value);
}
}
// 각 등급의 매핑된 정수를 입력하면 Enum 인스턴스 반환
}
예제 코드에서는 정수형 상수 값으로 사용자 레벨을 db에 저장하기 때문에 enum을 사용했습니다.
그런데 정수형 상수 값이 아닌 문자열로 db에 저장할 경우, enum이 정수값을 명시적이게 나타내준다는 장점이 없어지는데 이럴 때도 enum이 필요할까요?