概念:
被enum關(guān)鍵字修飾的類型就是枚舉類型,枚舉類型都隱式繼承Enum,根據(jù)java不可以多繼承的原理,不能再繼承其他類
枚舉類型中類可以定義變量和方法,如果不添加如何方法,枚舉值的默認(rèn)值默認(rèn)從0開(kāi)始
枚舉類型的構(gòu)造方法必須是私有的,
[public]enum 枚舉類型名稱[implements 接口名稱列表]
{
枚舉值;
變量成員聲明及初始化;
方法聲明及方法體;
}
示例:
enum Color{Red,BLUE,GREEN}
方法:
values():主要返回enum實(shí)例的數(shù)組,而且該數(shù)組中的元素嚴(yán)格保持在enum中聲明時(shí)的順序。
靜態(tài)的values()方法用于獲得枚舉類型的枚舉值的數(shù)組
toString():返回枚舉值字符串的描述
name():返回實(shí)例名
ordinal(): 返回實(shí)例聲明時(shí)的次序,從0開(kāi)始。
getDeclaringClass():返回實(shí)例所屬的enum類型
valueOf():方法將以字符串形式表示的枚舉值轉(zhuǎn)化為枚舉類型的對(duì)象
equals():判斷是否為同一個(gè)對(duì)象。也可以使用 == 來(lái)比較 enum實(shí)例
特性:
除了不能被繼承,可以把它當(dāng)作一個(gè)常規(guī)的類。不能被繼承是因?yàn)槟J(rèn)都是public static final
不可以使用=賦值,可以通過(guò)方法來(lái)顯示賦值
enum可以有普通方法,靜態(tài)方法,抽象方法,構(gòu)造方法
可以實(shí)現(xiàn)接口
工具類:
EnumSet:枚舉類型Set實(shí)現(xiàn),它要求放入它的枚舉常量必須屬于同一個(gè)枚舉類型。
EnumMap:是枚舉類型的Map實(shí)現(xiàn),相對(duì)比較高效,它也是只能接收同一個(gè)枚舉類型的實(shí)例作為鍵值。
public abstract class Enum<E extends Enum<E>> implements Comparable<E>, Serializable { ... }
//枚舉可以添加普通方法、靜態(tài)方法、抽象方法、構(gòu)造方法
public enum ErrorCode {
OK(0) {
public String getDescription() {
return "成功";
}
},
ERROR_A(100) {
public String getDescription() {
return "錯(cuò)誤A";
}
},
ERROR_B(200) {
public String getDescription() {
return "錯(cuò)誤B";
}
};
private int code;
// 構(gòu)造方法:enum的構(gòu)造方法只能被聲明為private權(quán)限或不聲明權(quán)限
private ErrorCode(int number) { // 構(gòu)造方法
this.code = number;
}
public int getCode() { // 普通方法
return code;
} // 普通方法
public abstract String getDescription(); // 抽象方法
public static void main(String args[]) { // 靜態(tài)方法
for (ErrorCode s : ErrorCode.values()) {
System.out.println("code: " + s.getCode() + ", description: " + s.getDescription());
}
}
}
// 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());
}