1、新建一个枚举类
public enum Apple{ FUJI, PIPPIN, GRANNY_SMITH }
通过查看字节码,可以看到,枚举类的实现方式:
1)继承自java.lang.Enum类。
2)构造类为private
3)枚举内的元素通过static域来引用
2、在枚举类中添加任意的方法和域。
public enum Apple { FUJI("red"), PIPPIN("green"), GRANNY_SMITH("orange"); private String color; Apple(String color) { this.color = color; }
public String getColor() {
return color;
}
}
在上面的类中:
1)添加了域color
2)创建了新的构造函数。
3)增加了新的方法。
3、在枚举中声明抽象方法,特定于常量的方法实现。
public enum Operation { PLUS { @Override double apply(double x, double y) { return x+y; } }, MINUS { @Override double apply(double x, double y) { return x-y; } }, TIMES { @Override double apply(double x, double y) { return x*y; } }, DIVIDE { @Override double apply(double x, double y) { return x/y; } }; abstract double apply(double x,double y); }
针对每个枚举值,分别定义不同的方法实现。
4、策略枚举
public enum PayrollDay { MONDAY(PayType.WEEDAY), TUESDAY(PayType.WEEDAY), WEDNESDAY(PayType.WEEDAY), THURSDAY(PayType.WEEDAY), FRIDAY(PayType.WEEDAY), SATURDAY(PayType.WEEKEND), SUNDAY(PayType.WEEKEND); private final PayType payType; PayrollDay(PayType payType) { this.payType = payType; } double pay(double houresWorked, double payRate){ return payType.pay(houresWorked, payRate); } private enum PayType{ WEEDAY { @Override double overtimePay(double hrs, double payRate) { return hrs<=HOURS_PER_SHIFT ? 0 : (hrs - HOURS_PER_SHIFT) * payRate / 2; } }, WEEKEND { @Override 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); } } }
针对常量如果可以进行分类,则可以定义一个策略枚举,来减少样板代码