HihoBookStudy / EffectiveJava

이펙티브 자바 북스터디입니다.
1 stars 0 forks source link

[Item 38] 열거 타입 확장 사례 #38

Closed Limgayoung closed 6 days ago

Limgayoung commented 1 month ago

책의 232페이지에서 대부분의 상황에서 열거 타입을 확장하는 것은 좋지 않은 생각이라고 했습니다. java 라이브러리를 제외하고 열거 타입을 확장해서 사용하는 것이 어울리는 쓰임이 연산 코드 말고 어떤 것이 더 있을지 궁금합니다.

ForteEscape commented 1 month ago

Q.

책의 232페이지에서 대부분의 상황에서 열거 타입을 확장하는 것은 좋지 않은 생각이라고 했습니다. java 라이브러리를 제외하고 열거 타입을 확장해서 사용하는 것이 어울리는 쓰임이 연산 코드 말고 어떤 것이 더 있을지 궁금합니다.

A.

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) {
                       // 유급 휴가에 대한 일당 계산
               }
        };
}
Limgayoung commented 1 month ago

오 어떻게 사용해야 할지 이해가 잘 됐습니다~! 감사합니다