Closed Limgayoung closed 6 days ago
Q.
책의 232페이지에서 대부분의 상황에서 열거 타입을 확장하는 것은 좋지 않은 생각이라고 했습니다. java 라이브러리를 제외하고 열거 타입을 확장해서 사용하는 것이 어울리는 쓰임이 연산 코드 말고 어떤 것이 더 있을지 궁금합니다.
A.
API가 제공하는 기본 연산 외에 사용자 확장 연산을 추가할 수 있도록 열어줘야 할 때가 있다고 책에서 이야기 하고 있습니다.
저희가 이전에 보았던 일급을 계산하는 열거 타입을 봅시다.
enum PayrollDay {
MONDAY(WEEKDAY), TUESDAY(WEEKDAY), WEDNESDAY(WEEKDAY), THURSDAY(WEEKDAY),
FRIDAY(WEEKDAY), SATURDAY(WEEKEND), SUNDAY(WEEKEND);
private static final int MINS_PER_SHIFT = 8 * 60;
private final PayType payType;
PayrollDay(PayType payType) {
this.payType = payType;
}
// nested enum
enum PayType {
WEEKDAY {
int overtimePay(int minsWorked, int payRate) {
return minutesWorked <= MINS_PER_SHIFT ?
0 : (minutesWorked - MINS_PER_SHIFT) * payRate / 2;
}
},
WEEKEND {
int overtimePay(int minsWorked, int payRate) {
return overtimePay = basePay / 2;
}
}
}
int pay(int minsWorked, int payRate) {
int basePay = minsWorked * payRate;
return basePay + this.payType.overtimePay(minsWorked, payRate);
}
}
만약 모든 날마다 일급의 계산 방법이 다르다면 어떻게 될까요? 아마 위와 같은 방식이 적용되기는 쉽지 않습니다. 이러면 각 날마다 어떻게 계산해야 하는지에 대한 함수가 구현되어야 합니다.
enum PayrollDay {
MONDAY {
@Override
public int pay(int minutesWorked, int payRate) {
// calc pay...
}
},
TUESDAY{
@Override
public int pay(int minutesWorked, int payRate) {
// calc pay...
}
},
WEDNESDAY{
@Override
public int pay(int minutesWorked, int payRate) {
// calc pay...
}
},
THURSDAY{
@Override
public int pay(int minutesWorked, int payRate) {
// calc pay...
}
},
FRIDAY{
@Override
public int pay(int minutesWorked, int payRate) {
// calc pay...
}
},
SATURDAY{
@Override
public int pay(int minutesWorked, int payRate) {
// calc pay...
}
},
SUNDAY{
@Override
public int pay(int minutesWorked, int payRate) {
// calc pay...
}
};
abstract int pay(int minutesWorked, int payRate);
}
// 일급 계산 인터페이스 타입
public interface PayCalculator {
int pay(int minutesWorked, int payRate);
}
enum PayrollDay implements PayCalculator {
MONDAY {
@Override
public int pay(int minutesWorked, int payRate) {
// calc pay...
}
},
TUESDAY{
@Override
public int pay(int minutesWorked, int payRate) {
// calc pay...
}
},
WEDNESDAY{
@Override
public int pay(int minutesWorked, int payRate) {
// calc pay...
}
},
THURSDAY{
@Override
public int pay(int minutesWorked, int payRate) {
// calc pay...
}
},
FRIDAY{
@Override
public int pay(int minutesWorked, int payRate) {
// calc pay...
}
},
SATURDAY{
@Override
public int pay(int minutesWorked, int payRate) {
// calc pay...
}
},
SUNDAY{
@Override
public int pay(int minutesWorked, int payRate) {
// calc pay...
}
};
}
// 특수한 상황에 대한 일당 계산 열거 타입
public enum ExtendedPayCalculator implements PayCalculator {
HALFVACATION {
@Override
public int pay(int minutesWorked, int payRate) {
// 반차에 대한 일당 계산
}
},
VACATION {
@Override
public int pay(int minutesWorked, int payRate) {
// 유급 휴가에 대한 일당 계산
}
};
}
오 어떻게 사용해야 할지 이해가 잘 됐습니다~! 감사합니다
책의 232페이지에서 대부분의 상황에서 열거 타입을 확장하는 것은 좋지 않은 생각이라고 했습니다. java 라이브러리를 제외하고 열거 타입을 확장해서 사용하는 것이 어울리는 쓰임이 연산 코드 말고 어떤 것이 더 있을지 궁금합니다.