概念
enum 的全稱爲 enumeration, 是 JDK 1.5 中引入的新特性。
在Java中,被 enum 關鍵字修飾的類型就是枚舉類型。
枚舉的方法
- values():返回 enum 實例的數組,而且該數組中的元素嚴格保持在 enum 中聲明時的順序。
- name():返回實例名。
- ordinal():返回實例聲明時的次序,從0開始。
- getDeclaringClass():返回實例所屬的 enum 類型。
- equals() :判斷是否爲同一個對象。
注意:可以使用 == 來比較enum實例。此外,java.lang.Enum實現了Comparable和 Serializable 接口,所以也提供 compareTo() 方法。
特點
1.JDK7後,switch語句支持enum類型參數了。
enum Signal {RED, YELLOW, GREEN}
public static String getTrafficInstruct(Signal signal) {
String instruct = "信號燈故障";
switch (signal) {
case RED:
instruct = "紅燈停";
break;
case YELLOW:
instruct = "黃燈請注意";
break;
case GREEN:
instruct = "綠燈行";
break;
default:
break;
}
return instruct;
}
2.除了不能繼承,枚舉基本可以看做是一個常規的類。
3.組織枚舉是,如果不用接口的方式,加上public修飾符才能全局訪問。
Java接口在編譯時會自動爲enum類型加上public static修飾符;Java類在編譯時會自動爲 enum 類型加上static修飾符。
4.與C/C++中不同,Java中不允許使用=爲枚舉常量賦值。
實例-接口約束枚舉
/**
*實現接口約束枚舉的方法
*/
public interface INumberEnum {
int getCode();
String getDescription();
}
public enum ErrorCodeEn2 implements INumberEnum {
OK(0, "成功"),
ERROR_A(100, "錯誤A"),
ERROR_B(200, "錯誤B");
ErrorCodeEn2(int number, String description) {
this.code = number;
this.description = description;
}
private int code;
private String description;
@Override
public int getCode() {
return code;
}
@Override
public String getDescription() {
return description;
}
}
策略枚舉
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 hours, double payRate) {
return hours <= HOURS_PER_SHIFT ? 0 : (hours - HOURS_PER_SHIFT)
* payRate / 2;
}
},
WEEKEND {
double overtimePay(double hours, double payRate) {
return hours * 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);
}
}
}
測試
System.out.println(“時薪100的人在週五工作8小時的收入:” + PayrollDay.FRIDAY.pay(8.0, 100));
System.out.println(“時薪100的人在週六工作8小時的收入:” + PayrollDay.SATURDAY.pay(8.0, 100));
EnumSet和EnumMap的使用
Java 中提供了兩個方便操作enum的工具類——EnumSet 和 EnumMap。
// EnumSet的使用
System.out.println("EnumSet展示");
EnumSet<ErrorCodeEn> errSet = EnumSet.allOf(ErrorCodeEn.class);
for (ErrorCodeEn e : errSet) {
System.out.println(e.name() + " : " + e.ordinal());
}
// EnumMap的使用
System.out.println("EnumMap展示");
EnumMap<StateMachine.Signal, String> errMap = new EnumMap(StateMachine.Signal.class);
errMap.put(StateMachine.Signal.RED, "紅燈");
errMap.put(StateMachine.Signal.YELLOW, "黃燈");
errMap.put(StateMachine.Signal.GREEN, "綠燈");
for (Iterator<Map.Entry<StateMachine.Signal, String>> iter = errMap.entrySet().iterator(); iter.hasNext();) {
Map.Entry<StateMachine.Signal, String> entry = iter.next();
System.out.println(entry.getKey().name() + " : " + entry.getValue());
}