java中enum的用法總結
阿新 • • 發佈:2018-10-31
一、enum的語法與基本作用
建立一個列舉型別需要使用關鍵字enum,隱含了所建立的類都是java.lang.Enum的子類。列舉型別的每一個值都被對映到protect enum(String name, int ordinal);的建構函式中,在這裡列舉的每一個值都被轉換成一個字串,並且同時對應一個下標(從0開始的)。
在實際開發中往往需要處理一些“資料集”,這些資料集在程式中是相對穩定的,如一週的七天或一年四季等,這時列舉就派上了用處。
public enum TestEnum{
//這裡的每一個值其實也相當於是一個例項
MON, TUE, WED, THU, FRI, SAT, SUN;
}
//這段程式碼其實相當於呼叫了7次protect enum(String name, int ordinal);
new Enum<TestEnum>("MON", 0);
new Enum<TestEnum>("TUE", 1);
......
二、遍歷、switch 等常用操作
對enum進行遍歷和switch的操作示例程式碼:
public class Test {
public static void main(String[] args) {
for (EnumTest e : EnumTest.values()) {
System.out.println(e.toString());
}
System.out.println("----------------我是分隔線------------------" );
EnumTest test = EnumTest.TUE;
switch (test) {
case MON:
System.out.println("今天是星期一");
break;
case TUE:
System.out.println("今天是星期二");
break;
// ... ...
default:
System.out.println(test);
break ;
}
}
}
輸出結果:
MON
TUE
WED
THU
FRI
SAT
SUN
—————-我是分隔線——————
今天是星期二
enum 物件的常用方法介紹
int compareTo(E o)
比較此列舉與指定物件的順序。
Class getDeclaringClass()
返回與此列舉常量的列舉型別相對應的 Class 物件。
String name()
返回此列舉常量的名稱,在其列舉宣告中對其進行宣告。
int ordinal()
返回列舉常量的序數(它在列舉宣告中的位置,其中初始常量序數為零)。
String toString()
返回列舉常量的名稱,它包含在宣告中。
static
public class Test {
public static void main(String[] args) {
EnumTest test = EnumTest.TUE;
//compareTo(E o)
switch (test.compareTo(EnumTest.MON)) {
case -1:
System.out.println("TUE 在 MON 之前");
break;
case 1:
System.out.println("TUE 在 MON 之後");
break;
default:
System.out.println("TUE 與 MON 在同一位置");
break;
}
//getDeclaringClass()
System.out.println("getDeclaringClass(): " + test.getDeclaringClass().getName());
//name() 和 toString()
System.out.println("name(): " + test.name());
System.out.println("toString(): " + test.toString());
//ordinal(), 返回值是從 0 開始
System.out.println("ordinal(): " + test.ordinal());
}
}
輸出結果:
TUE 在 MON 之後
getDeclaringClass(): com.hmw.test.EnumTest
name(): TUE
toString(): TUE
ordinal(): 1
三、給列舉型別自定義屬性和方法
public enum TestEnum{
//必須寫在第一行,要麼全部賦值要麼全不賦值
MON(1), TUE(2), WED(3), THU(4), FRI(5), SAT(6), SUN(0){
public int text(){
return i;
}
};
private int value;
private TestEnum(int value){
this.value = value;
}
public int getValue(){
return value;
}
}
public static void main(String[] args) {
System.out.println(EnumTest.WED.getValue(););
}
四、EnumMap和EnumSet的應用
public static void main(String[] args) {
// EnumSet的使用
EnumSet<TestEnum> weekSet = Enum.allOf(TestEnum.class);
for(TestEnum day : weekSet){
System.out.println(day);
}
// EnumMap的使用
EnumMap<TestEnum, String> weekMap = new EnumMap(TestEnum.class);
weekMap.put(TestEnum.MON, "星期一");
for(Iterator<Entry<TestEnum, String>> iter = weekMap.entrySet().iterator(); iter.hashNext();){
Entry<TestEnum, String> entry = iter.next();
System.out.println(entry.getKey().name + entry.getValue());
}
}
總結
實際上可以吧enum看做一個普通的class類,他們都可以定義自己的屬性和方法,不同之處在於enum不可以繼承,因為java是單繼承,已經繼承了java.lang.Enum.