JAVA - 枚舉類型

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);
    ... ...

常用方法

返回類型方法名稱方法說明
intcompareTo(E o)比較此枚舉與指定對象的順序。(其內部實現是根據每個枚舉的ordinal值大小進行比較的
booleanequals(Object other)當指定對象等於此枚舉常量時,返回 true。
Class<?>getDeclaringClass()返回與此枚舉常量的枚舉類型相對應的 Class 對象
Stringname()返回此枚舉常量的名稱,在其枚舉聲明中對其進行聲明
intordinal()返回枚舉常量的序數(它在枚舉聲明中的位置,其中初始常量序數爲零)
StringtoString()返回枚舉常量的名稱,它包含在聲明中
static<T extends Enum<T>> T

Enum<T>[]
static valueOf(Class<T> enumType, String name)

static values(Class<T> enumType)
返回帶指定名稱的指定枚舉類型的枚舉常量。


獲取枚舉類中的所有變量,並作爲數組返回

使用場景

    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);  
    }  
}  
發佈了0 篇原創文章 · 獲贊 10 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章