public enum Apple {FUJI, PIPPIN, GRANNY_SMITH}
public enum Orange {NAVEL, TEMPLE, BLOOD}
열거 타입 자체는 클래스. 상수 하나당 자신의 인스턴스를 하나씩 생성
public static final
필드로 공개. 사실상 final
외부 생성자를 제공하지않기 때문에, 딱 하나만 존재한다는 것이 보장된다.
Comparable
Serializable
구현.
public enum Operation{
PLUS, MINUS, TIMES, DIVIDE;
public double apply(double x, double y) {
switch (this) {
case PLUS: return x + y;
case MINUS: return x -y;
case TIMES: return x * y;
case DIVIDE: return x / y;
}
throw new AssertionError("NOT_SUPPORTED_OPERATOR" + this);
}
}
enum 타입에 따른 동적 메소드 적용.
하지만, 예외타입까지 갈 일은 없다.
public enum Operation{
public abstract double apply(double x, double y);
PLUS{
public double apply(double x, double y){
return x + y;}
},
MINUS {
@Override
public double apply(double x, double y) {
return x - y;
}
},
TIMES {
@Override
public double apply(double x, double y) {
return x * y;
}
},
DIVIDE {
@Override
public double apply(double x, double y) {
return x / y;
}
};
}
case 문을 제거한, 동적 메소드 적용
enum type에 따라 다른 메소드가 동적으로 호출되게 구조를 작성
이후 type이 추가되어도 추가만을 통해 확장 가능.
enum PayrollDay{
MONDAY(PayType.WEEKDAY),
TUESDAY(PayType.WEEKDAY), WEDNESDAY(PayType.WEEKDAY),
THURSDAY(PayType.WEEKDAY), FRIDAY(PayType.WEEKDAY),
SATURDAY(PayType.WEEKEND), SUNDAY(PayType.WEEKEND);
private final PayType payType;
PayrollDay(PayType payType) {
this.payType = payType;
}
int pay(int minutesWorked, int payRate) {
return payType.pay(minutesWorked, payRate);
}
enum PayType{
WEEKDAY{
int overtimePay(int minsWorked, int payRate) {
return minsWorked <= MINS_PER_SHIFT ? 0 :
(minsWorked - MINS_PER_SHIFT) * payRate / 2;
}
},
WEEKEND{
int overtimePay(int minsWorked, int payRate) {
return minsWorked * payRate / 2;
}
};
abstract int overtimePay(int mins, int payRate);
private static final int MINS_PER_SHIFT = 8 * 60;
int pay(int minsWorked, int payRate) {
int basePay = minsWorked * payRate;
return overtimePay(minsWorked, payRate) + basePay;
}
}
}
필요한 원소를 컴파일타임에 다알 수 있는 상수 집합이라면 항상 열거 타입 사용.
열거 타입에 정의한 상수 개수가 영원히 고정불변일 필요는 없다.