Java枚舉值
枚舉類型定義了兩件事:
- 枚舉常量名稱
- 常量的順序
以下代碼聲明瞭一個名爲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