程序的主要几个比较重要且复杂用法之一枚举
1.普通枚举,
public enum Days {
monday,sunday........;
}
2.枚举像普通的类一样可以添加属性和方法,可以为它添加静态和非静态的属性或方法
public enum SeasonEnum {
spring, summer, autumn, winter;
private final static String position = "test";
public static SeasonEnum getSeason() {
if ("test".equals(position))
return spring;
else
return winter;
}
}
3.实现带有构造器的枚举
public enum Gender{
//通过括号赋值,而且必须带有一个参构造器和一个属性跟方法,否则编译出错
//赋值必须都赋值或都不赋值,不能一部分赋值一部分不赋值;如果不赋值则不能写构造器,赋值编译也出错
MAN("MAN"), WOMEN("WOMEN");
private final String value;
//构造器默认也只能是private, 从而保证构造函数只能在内部使用
Gender(String value) {
this.value = value;
}
public String getValue() {
return value;
}
- //覆盖方法
- @Override
- public String toString() {
- return this.index+"_"+this.name;
- }
}
4.实现带有抽象方法的枚举,对于枚举类实例对象不同的行为,需要在枚举类中声明为抽象方法,然后在枚举实例对象中提供具体的实现
public enum OrderState {
/** 已取消 */
CANCEL {public String getName(){return "已取消";}},
/** 待审核 */
WAITCONFIRM {public String getName(){return "待审核";}},
/** 等待付款 */
WAITPAYMENT {public String getName(){return "等待付款";}},
/** 正在配货 */
ADMEASUREPRODUCT {public String getName(){return "正在配货";}},
/** 等待发货 */
WAITDELIVER {public String getName(){return "等待发货";}},
/** 已发货 */
DELIVERED {public String getName(){return "已发货";}},
/** 已收货 */
RECEIVED {public String getName(){return "已收货";}};
public abstract String getName(); //抽象方法
}
5.枚举是无法编写可扩展的枚举类型,却可以通过编写接口以及实现该接口的基础枚举类型来对枚举进行扩展。
我们上面那OrderState来进行扩展,那我们就要先将OrderState用来实现一个热接口
public interface iOrderState
{
public String() getName();
}
public enum OrderState implements iOrderState
后面代码一样,
我们现在进行扩展,让一个新的OrderState来实现iOrderState就可以扩展
如下public enum ExtentOrderState implements iOrderState
6.枚举策略(这个就比较强悍了)
工作日枚举对象共享相同的行为,而周末枚举对象共享相同的行为,因此将工作日和周末抽取为内部策略枚举,当增加不同行为的枚举实例时,只需要修改内部枚举策略即可,客户端使用代码不用做修改
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 hoursWorked, double payRate) {
return payType.pay(hoursWorked, payRate);
}
// 策略枚举
private enum PayType
{
WEEKDAY {
double overtimePay(double hoursWorked, double payRate) {
return hoursWorked <= HOURS_PER_SHIFT ? 0 : (hoursWorked - HOURS_PER_SHIFT)
* payRate / 2;
}
},
WEEKEND {
double overtimePay(double hoursWorked, double payRate) {
return hoursWorked * payRate / 2;
}
};
private static final int HOURS_PER_SHIFT = 8;
abstract double overtimePay(double hoursWorked, double payRate);
double pay(double hoursWorked, double payRate) {
double basePay = hoursWorked * payRate;
return basePay + overtimePay(hoursWorked, payRate);
}
}
public static void main(String[] args) {
PayrollDay p = PayrollDay.FRIDAY;
System.out.print(p.pay(10,10));
}
}