Item 30.
int 상수 대신 enum을 사용하자.
Chapter 6. 열거형과 주석
열거형(enumerated type)
• anti-pattern : int constant (int enum) pattern
public static final int APPLE_FUJI = 0;
public static final int APPLE_PIPPIN = 1;
public static final int APPLE_GRANNY_SMITH =
2;
public static final int ORANGE_NAVEL = 0;
public static final int ORANGE_TEMPLE = 1;
public static final int ORNAGE_BLOOD = 2;
열거형(enumerated type)
• enum : A type of objects with a fixed set of constant values.
• 하나의 열거형 상수마다 하나의 인스턴스를 외부에 제공 - 싱글톤
• 접근 가능한 생성자가 없음 – final, enum의 인스턴스는 없음
• 컴파일 시점의 타입 안전 제공
• 자신만의 네임스페이스를 갖기 때문에 동일한 이름의 상수를 갖는
enum 타입들이 공존 가능
• toString 호출 가능
public enum Apple { FUJI, PIPPIN, GRANNY_SMITH }
public enum Orange { NAVEL, TEMPLE, BLOOD }
열거형(enumerated type)
• enum : A type of objects with a fixed set of constant values.
public enum Apple { FUJI, PIPPIN, GRANNY_SMITH }
public enum Orange { NAVEL, TEMPLE, BLOOD }
public final class Apple extends Enum<Apple> {
public static final Apple FUJI = new Apple();
public static final Apple PIPPIN = new Apple();
public static final Apple GRANNY_SMITH = new Apple();
private Apple() {
} // no more can be made
}
switch statement
public enum Operation {
PLUS, MINUS, TIMES, DIVIDE;
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("Unknown op: " + this);
}
}
constant-specific method
public enum Operation {
PLUS { double apply(double x, double y)
{ return x + y; } },
MINUS { double apply(double x, double y)
{ return x - y; } },
TIMES { double apply(double x, double y)
{ return x * y; } },
DIVIDE { double apply(double x, double y)
{ return x / y; } };
abstract double apply(double x, double y);
}
코드 공유를 위한 switch statement
public enum PayrollDay {
MONDAY, TUESDAY, WEDNESDAY, THURSdDAY, FRIDAY, SATURDAY,
SUNDAY;
private static final int HOURS_PER_SHIFT = 8;
double pay(double hoursWorked, double payRate) {
double basePay = hoursWorked * payRate;
double overtimePay;
switch(this) {
case SATURDAY : case SUNDAY:
overtimePay = hoursWorked * payRate / 2;
break;
default :
overtimePay = hoursWorked <= HOURS_PER_SHIFT ?
0 : (hoursWorked - HOURS_PER_SHIFT) * payRate / 2;
break;
}
return basePay + overtimePay;
}
}
전략 enum 패턴
• 초과 근무 수당 계산 코드를 중첩된 private enum으로 옮
긴 후, 이 enum의 인스턴스를 PayrollDay enum의 생성
자로 전달
• PayrollDay enum에서는 그 전략 enum에게 초과 근무 수
당 계산을 위임
요약.
• enum은 int constant에 비해 가독성, 안전성이 뛰어남
• 데이터를 각 상수와 연관시키고 그 데이터에 영향을 받는
메소드를 제공하여 이점을 누릴 수 있음
• 여러 개의 enum 상수가 공통적인 동작을 공유한다면 전
략 enum 패턴 사용을 고려

Item 30 int 상수 대신 enum을 사용하자

  • 1.
    Item 30. int 상수대신 enum을 사용하자. Chapter 6. 열거형과 주석
  • 2.
    열거형(enumerated type) • anti-pattern: int constant (int enum) pattern public static final int APPLE_FUJI = 0; public static final int APPLE_PIPPIN = 1; public static final int APPLE_GRANNY_SMITH = 2; public static final int ORANGE_NAVEL = 0; public static final int ORANGE_TEMPLE = 1; public static final int ORNAGE_BLOOD = 2;
  • 3.
    열거형(enumerated type) • enum: A type of objects with a fixed set of constant values. • 하나의 열거형 상수마다 하나의 인스턴스를 외부에 제공 - 싱글톤 • 접근 가능한 생성자가 없음 – final, enum의 인스턴스는 없음 • 컴파일 시점의 타입 안전 제공 • 자신만의 네임스페이스를 갖기 때문에 동일한 이름의 상수를 갖는 enum 타입들이 공존 가능 • toString 호출 가능 public enum Apple { FUJI, PIPPIN, GRANNY_SMITH } public enum Orange { NAVEL, TEMPLE, BLOOD }
  • 4.
    열거형(enumerated type) • enum: A type of objects with a fixed set of constant values. public enum Apple { FUJI, PIPPIN, GRANNY_SMITH } public enum Orange { NAVEL, TEMPLE, BLOOD } public final class Apple extends Enum<Apple> { public static final Apple FUJI = new Apple(); public static final Apple PIPPIN = new Apple(); public static final Apple GRANNY_SMITH = new Apple(); private Apple() { } // no more can be made }
  • 5.
    switch statement public enumOperation { PLUS, MINUS, TIMES, DIVIDE; 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("Unknown op: " + this); } }
  • 6.
    constant-specific method public enumOperation { PLUS { double apply(double x, double y) { return x + y; } }, MINUS { double apply(double x, double y) { return x - y; } }, TIMES { double apply(double x, double y) { return x * y; } }, DIVIDE { double apply(double x, double y) { return x / y; } }; abstract double apply(double x, double y); }
  • 7.
    코드 공유를 위한switch statement public enum PayrollDay { MONDAY, TUESDAY, WEDNESDAY, THURSdDAY, FRIDAY, SATURDAY, SUNDAY; private static final int HOURS_PER_SHIFT = 8; double pay(double hoursWorked, double payRate) { double basePay = hoursWorked * payRate; double overtimePay; switch(this) { case SATURDAY : case SUNDAY: overtimePay = hoursWorked * payRate / 2; break; default : overtimePay = hoursWorked <= HOURS_PER_SHIFT ? 0 : (hoursWorked - HOURS_PER_SHIFT) * payRate / 2; break; } return basePay + overtimePay; } }
  • 8.
    전략 enum 패턴 •초과 근무 수당 계산 코드를 중첩된 private enum으로 옮 긴 후, 이 enum의 인스턴스를 PayrollDay enum의 생성 자로 전달 • PayrollDay enum에서는 그 전략 enum에게 초과 근무 수 당 계산을 위임
  • 9.
    요약. • enum은 intconstant에 비해 가독성, 안전성이 뛰어남 • 데이터를 각 상수와 연관시키고 그 데이터에 영향을 받는 메소드를 제공하여 이점을 누릴 수 있음 • 여러 개의 enum 상수가 공통적인 동작을 공유한다면 전 략 enum 패턴 사용을 고려