지금까지 설명한 문제를 해결하기 위해서 타입 안정 열거형 패턴이다.
타입 안정 열거형 패턴을 사용하면 나열한 항목만 사용 할 수 있다는 점이 특징이다.
package enumeration.ex2;
public class ClassGrade {
public static final ClassGrade BASIC = new ClassGrade();
public static final ClassGrade GOLD = new ClassGrade();
public static final ClassGrade DIAMOND = new ClassGrade();
// private 생성자 추가
private ClassGrade() {
}
}
package enumeration.ex2;
public class DiscountService {
public int discount(ClassGrade classGrade, int price) {
int discountPercent = 0;
if (classGrade == ClassGrade.BASIC) {
discountPercent = 10;
} else if (classGrade == ClassGrade.GOLD) {
discountPercent = 20;
} else if (classGrade == ClassGrade.DIAMOND) {
discountPercent = 30;
} else {
System.out.println("할인X");
}
return price * discountPercent / 100;
}
}
package enumeration.ex2;
public class ClassGrade_Ex2_1 {
public static void main(String[] args) {
int price = 10000;
DiscountService discountService = new DiscountService();
int basic = discountService.discount(ClassGrade.BASIC, price);
int gold = discountService.discount(ClassGrade.GOLD, price);
int diamond = discountService.discount(ClassGrade.DIAMOND, price);
System.out.println("BASIC 등급의 할인액: " + basic);
System.out.println("GOLD 등급의 할인액: " + gold);
System.out.println("DIAMOND 등급의 할인액: " + diamond);
}
}
그런데 이 방식은 외부에서 임의로 ClassGrade의 인스턴스를 생성할 수도 있다.
이 문제를 해결하기 위해 ClassGrade를 생성할 수 없도록 막아버리자.
// private 생성자 추가
private ClassGrade() {
}
타입 안정성 향상: 정해진 객체만 사용할 수 있기 때문에, 잘못된 값을 입력하는 근본적인 문제를 해결할 수 있다.
데이터 일관성: 정해진 객체만 사용하므로 데이터 일관성이 보장된다.
제한된 인스턴스 생성: 외부에서 이 인스턴스들만 사용할 수 있도록 제한한다.
단점: 이 패턴을 구현하려면 많은 코드를 작성해야한다.