1. 程式人生 > >java中enum的用法總結

java中enum的用法總結

一、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.