열거형(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);
}