1. 程式人生 > >Java原始碼系列(3):列舉型別

Java原始碼系列(3):列舉型別

hello,everybody。沒想到今天會推文吧,趕緊誇我,勤快的小仙女。

好,我們今天認真的講一下列舉型別,大家肯定都用過,比如這樣的

//定義列舉型別
enum Day {
  MONDAY, TUESDAY, WEDNESDAY,
  THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

那我們先來看一下他的概念是啥,列舉型別是Java5新增的特性,他是一種特殊的資料型別,是因為他既是一種類(class)型別,又比普通的型別多了寫特殊的約束。

比如剛才舉的例子,如果我們不用列舉型別也行,那就定義常量就行,如下圖:

但是這樣做是存在缺點的,比如我在裡面寫錯啦一個單詞,如下圖:

他是不提示我的,可是我如果用列舉,他就可以提示我資料重複,如下圖:

還有就是不用列舉型別,程式碼不夠簡潔,冗餘程式碼太多。

我們先編譯一個上面寫的Day.java檔案,然後反編譯他,看他編譯出來的結果是什麼,如下圖:

從上圖我們可以看出反編譯出來Day是一個final型別,也就是不能被其他類繼承,並且他是繼承於Enum類的。如果我們定義一個列舉型別,其實Java替我們做了定義常量這件事情,也就是上圖1的區域。區域3,4是由編譯器插入的,下面的圖借的人家的。

值得注意的是這兩個方法是有編譯器插入的,所以他只停留在本類的層面。不信咱就試試

 我們找到Enum類,看一下他裡面有哪些方法,以及各方法的作用。

compareTo:比較我的序數與你的序數之間的差別。

equals:比較列舉型別是否相等。

getDeclaring:與該列舉型別值相對應的類。

ordinal:返回列舉常量的序數。

valueOf:返回帶指定名稱的指定列舉型別的列舉常量,如果不存在,會直接報錯,如下圖中標紅區域。

空講沒意思,我們來練練。