列舉型別定義了兩件事:
以下程式碼宣告了一個名為Level
的公共列舉型別,它具有四個列舉常數:LOW
,MEDIUM
,HIGH
和 URGENT
。
public enum Level {
LOW, MEDIUM, HIGH, URGENT;
}
Level
列舉型別定義了四個列舉常數。
級別列舉型別的變數只能是以下四個值之一 - LOW
,MEDIUM
,HIGH
和 URGENT
或 null
。可以通過使用列舉型別名稱作為限定符和點符號來參照列舉常數。
以下程式碼將Level
列舉型別常數的值分配給一些區域性變數:
Level low = Level.LOW;
Level medium = Level.MEDIUM;
Level high = Level.HIGH;
Level urgent = Level.URGENT;
但是不能範例化列舉型別。例如,以下程式碼導致編譯時錯誤:
Level badAttempt = new Level(); // A compile-time error
列舉順序號 列舉型別為其所有常數分配一個順序號,稱為ordinal
。順序值從零開始,在常數列表中從第一個到最後一個依次遞增1
。第一個列舉常數賦值為0
,第二個為1
,第三個為2
,依此類推。
分配給Level
列舉型別中宣告的常數的序數值是:將0
分配給LOW
,1
分配給MEDIUM
,2
到HIGH
,以及3
到URGENT
。
每個列舉常數都有一個與常數的識別符號相同的名稱。例如,級別列舉型別中的LOW
常數的名稱為「LOW
」。可以分別使用name()
和ordinal()
方法獲取列舉常數的名稱和序號值。每個列舉型別都有一個名為values()
的靜態方法,它按在列舉主體中宣告的順序返回一個常數陣列。
以下程式碼列印在Level
列舉型別中宣告的所有列舉常數的名稱和序號。
enum Level {
LOW, MEDIUM, HIGH, URGENT;
}
public class Main {
public static void main(String[] args) {
for (Level s : Level.values()) {
String name = s.name();
int ordinal = s.ordinal();
System.out.println(name + "(" + ordinal + ")");
}
}
}
上面的程式碼生成以下結果。
LOW(0)
MEDIUM(1)
HIGH(2)
URGENT(3)
可以從名稱或位置獲得列舉常數的參照。使用valueOf()
方法就可以做到這點。
列舉常數的反向查詢區分大小寫。可以使用values()
方法返回的陣列,通過順序執行反向查詢。values()
方法返回的陣列中的值的順序與列舉常數的宣告順序相同。列舉常數的序數從零開始。
以下程式碼演示了如何反轉查詢列舉常數:
enum Level {
LOW, MEDIUM, HIGH, URGENT;
}
public class Main {
public static void main(String[] args) {
Level low1 = Level.valueOf("LOW");
// A reverse lookup using a name
Level low2 = Level.values()[0];
// A reverse lookup using an ordinal
System.out.println(low1);
System.out.println(low2);
System.out.println(low1 == low2);
}
}
執行上面的範例程式碼,得到如下結果 -
LOW
LOW
true
java.util.EnumSet
集合類與列舉型別的列舉常數列表一起使用。
下面的程式碼演示了如何使用EnumSet
類來處理列舉常數的範圍。
import java.util.EnumSet;
enum Level {
LOW, MEDIUM, HIGH, URGENT;
}
public class Main {
public static void main(String[] args) {
EnumSet<Level> allLevels = EnumSet.allOf(Level.class);
print(allLevels);
EnumSet<Level> l = EnumSet.range(Level.LOW, Level.URGENT);
print(l);
}
public static void print(EnumSet<Level> levels) {
for (Level d : levels) {
System.out.println(d + " ");
}
}
}
執行上面的範例程式碼,得到如下結果 -
LOW
MEDIUM
HIGH
URGENT
LOW
MEDIUM
HIGH
URGENT