enum 的全稱爲 enumeration, 是 JDK 1.5 中引入的新特性,存放在 java.lang 包中。
原理
- 創建枚舉類型要使用 enum 關鍵字,隱含了所創建的類型都是 java.lang.Enum 類的子類(java.lang.Enum 是一個抽象類),也就是說通過關鍵字enum創建枚舉類型在編譯後事實上也是一個類類型而且該類繼承自java.lang.Enum類。
- 值一般是大寫的字母,多個值之間以逗號分隔。
- 枚舉類型可以像類(class)類型一樣,定義爲一個單獨的文件,當然也可以定義在其他類內部。
public class Test {
public static void main(String[] args) {
System.out.println(Signal.GREEN);
System.out.println(Day.FRIDAY);
}
enum Signal {
GREEN, YELLOW, RED
}
}
enum Day {
MONDAY, TUESDAY, WEDNESDAY,
THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
- 枚舉類型的每一個值都將映射到
protected Enum(String name, int ordinal)
構造函數中,在這裏,每個值的名稱都被轉換成一個字符串,並且序數設置表示了此設置被創建的順序。
public enum EnumTest {
MON, TUE, WED, THU, FRI, SAT, SUN;
}
這段代碼實際上調用了7次 Enum(String name, int ordinal):
new Enum<EnumTest>("MON",0);
new Enum<EnumTest>("TUE",1);
new Enum<EnumTest>("WED",2);
... ...
常用方法
返回類型 | 方法名稱 | 方法說明 |
---|---|---|
int | compareTo(E o) | 比較此枚舉與指定對象的順序。(其內部實現是根據每個枚舉的ordinal值大小進行比較的) |
boolean | equals(Object other) | 當指定對象等於此枚舉常量時,返回 true。 |
Class<?> | getDeclaringClass() | 返回與此枚舉常量的枚舉類型相對應的 Class 對象 |
String | name() | 返回此枚舉常量的名稱,在其枚舉聲明中對其進行聲明 |
int | ordinal() | 返回枚舉常量的序數(它在枚舉聲明中的位置,其中初始常量序數爲零) |
String | toString() | 返回枚舉常量的名稱,它包含在聲明中 |
static<T extends Enum<T>> T | static valueOf(Class<T> enumType, String name) | 返回帶指定名稱的指定枚舉類型的枚舉常量。 |
使用場景
1. 表示常量
2. switch條件表達式
enum Signal {
GREEN, YELLOW, RED
}
public class TrafficLight {
Signal color = Signal.RED;
public void change() {
switch (color) {
case RED:
color = Signal.GREEN;
break;
case YELLOW:
color = Signal.RED;
break;
case GREEN:
color = Signal.YELLOW;
break;
}
}
}
3. 遍歷枚舉
public class Test {
public static void main(String[] args) {
for (EnumTest e : EnumTest.values()) {
System.out.println(e.toString());
}
}
}
4. 向枚舉中添加新方法
必須在enum實例序列的最後添加一個分號。而且 Java 要求必須先定義 enum 實例。
public enum Color {
RED("紅色", 1), GREEN("綠色", 2), BLANK("白色", 3), YELLO("黃色", 4);
// 成員變量
private String name;
private int index;
// 構造方法
private Color(String name, int index) {
this.name = name;
this.index = index;
}
// 普通方法
public static String getName(int index) {
for (Color c : Color.values()) {
if (c.getIndex() == index) {
return c.name;
}
}
return null;
}
// get set 方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
}
5. 覆蓋枚舉的方法
父類Enum中的定義的方法只有toString方法沒有使用final修飾,因此只能覆蓋toString方法
public enum Color {
RED("紅色", 1), GREEN("綠色", 2), BLANK("白色", 3), YELLO("黃色", 4);
// 成員變量
private String name;
private int index;
// 構造方法
private Color(String name, int index) {
this.name = name;
this.index = index;
}
//覆蓋方法
@Override
public String toString() {
return this.index+"_"+this.name;
}
}
6. 實現接口
所有的枚舉都繼承自java.lang.Enum類。由於Java 不支持多繼承,所以枚舉對象不能再繼承其他類。
public interface Behaviour {
void print();
String getInfo();
}
public enum Color implements Behaviour{
RED("紅色", 1), GREEN("綠色", 2), BLANK("白色", 3), YELLO("黃色", 4);
// 成員變量
private String name;
private int index;
// 構造方法
private Color(String name, int index) {
this.name = name;
this.index = index;
}
//接口方法
@Override
public String getInfo() {
return this.name;
}
//接口方法
@Override
public void print() {
System.out.println(this.index+":"+this.name);
}
}