이펙티브 자바 34

참치돌고래·2022년 12월 27일
0

이펙티브 자바

목록 보기
19/21

enum type (열거타입)

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;
            }

        }
    }

enum type 사용

필요한 원소를 컴파일타임에 다알 수 있는 상수 집합이라면 항상 열거 타입 사용.

열거 타입에 정의한 상수 개수가 영원히 고정불변일 필요는 없다.

profile
안녕하세요

0개의 댓글