构造器和枚举实例通用方法的使用:
public enum Planet {
PLANET1 (1,2),
PLANET2 (2,3),
PLANET3 (3,4);
private final int mass;
private final int radius;
private final int surfaceWeight;
Planet(int mass, int radius) {
this.mass = mass;
this.radius = radius;
this.surfaceWeight = mass * radius;
}
public double getSurfaceWeight() {
return surfaceWeight;
}
}
枚举天生不可变,因此所有域都必须为final,而java中final域若在申明时不初始化,则必须在构造器中初始化。因此构造器中必须对所有域初始化,否则编译器将报错。
所有枚举都有一个静态的values方法按照声明顺序返回它的值数组。
若枚举中的每个实体都需要与一种特定的行为相关联,则可以在枚举类型中声明一个抽象的apply方法,这种方法被称作特定于常量的方法实现(constant-specific method implementation) :
public enum Operation {
PLUS {
double apply(double x, double y) {
return x + y;
}
},
MINUS {
double apply(double x, double y) {
return x - y;
}
};
abstract double apply(double x, double y);
}
//实现fromString方法
private static final Map<String, Operation> stringToEnum = new HashMap<String, Operation>();
static {
for (Operation op : values()) {
stringToEnum.put(op.toString(), op);
}
}
public static Operation fromString(String symbol) {
return stringToEnum.get(symbol);
}
枚举可以和策略模式很好地配合,使用一个枚举类表示一个策略集合,每个枚举实例代表一个具体策略:
public enum PayType {
//枚举数据的定义必须放在最上端
WEEKDAY{
double overtimePay(double hrs, double payRate){
return hrs < HOURS_PER_SHIFT ? 0 : (hrs - HOURS_PER_SHIFT) * payRate/2;
}
},
WEEKEND{
double overtimePay(double hrs,double payRate){
return hrs * payRate / 2;
}
};
private static final int HOURS_PER_SHIFT = 8;
abstract double overtimePay(double hrs, double payRate);
double pay(double hoursWorked, double payRate) {
double basePay = hoursWorked * payRate;
return basePay + overtimePay(hoursWorked, payRate);
}
}
PayType为策略类,其中WEEKDAY和WEEKEND为两种具体策略,特定于常量的方法和通用方法的结合使用
public 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;
}
double pay(double workedHours, double payRate) {
return paytype.pay(workedHours, payRate);
}
}