Java中的枚舉類型

  一:枚舉的引入java

  enum全稱enumeration,是JDK1.5中引入的新特性,存放在java.lang包中。下面就平時的學習和使用過程當中用到的進行總結:安全

  枚舉(enum),是指一個通過排序的,被打包成一個單一實體的項列表。一個枚舉的實例可使用枚舉項列表中任意單一項的值。枚舉在各個語言當中都有着普遍的應用,一般用來表示顏色,方式,類別,狀態等等數目有限,形式離散,表達又極爲明確的量。因此Java從JDK1.5以後,引入了對枚舉的支持。函數

  那麼在枚舉出現以前,若是想表示一組特定的離散值,每每使用一些常量。例如:學習

  

  固然,常量也不只僅侷限於int型,諸如char和String等也是不在少數。然而,不管使用什麼樣的類型,這樣作都有不少的壞處。這些常量一般都是連續、有無窮多個值的量,而相似這種表示類別的量則是離散的,而且一般狀況下只有有限個值。用連續的量去表示離散量,會產生不少問題。例如,針對上述的Entity類,若是要對Entity對象的type屬性進行賦值,通常會採用以下方法:spa

  

  這樣作的缺點有:(1)代碼可讀性差、易用性低。因爲setType()方法的參數是int型的,在閱讀代碼的時候每每會讓讀者感到一頭霧水,根本不明白這個2究竟是什麼意思,表明的是什麼類型。固然,要保證可讀性,還有這樣一個辦法:3d

  

  而這樣的話,問題又來了。這樣作,客戶端必須對這些常量去創建理解,才能瞭解如何去使用這個東西。說白了,在調用的時候,若是用戶不到Entity類中去看看,還真不知道這個參數應該怎麼傳、怎麼調。像是setType(2)這種用法也是在所不免,由於它徹底合法,不是每一個人都可以創建起用常量名代替數值,從而增長程序可讀性、下降耦合性的意識。code

  (2)類型不安全。在用戶去調用的時候,必須保證類型徹底一致,同時取值範圍也要正確。像是setType(-1)這樣的調用是合法的,但它並不合理,從此會爲程序帶來種種問題。也許你會說,加一個有效性驗證嘛,可是,這樣作的話,又會引出下面的第(3)個問題。對象

  (3)耦合性高,擴展性差。假如,由於某些緣由,須要修改Entity類中常量的值,那麼,全部用到這些常量的代碼也就都須要修改——固然,要仔細地修改,萬一漏了一個,那可不是開玩笑的。同時,這樣作也不利於擴展。例如,假如針對類別作了一個有效性驗證,若是類別增長了或者有所變更,則有效性驗證也須要作對應的修改,不利於後期維護。blog

  枚舉就是爲了這樣的問題而誕生的。它們給出了將一個任意項同另外一個項相比較的能力,而且能夠在一個已定義項列表中進行迭代。枚舉(在Jave中簡稱爲enum)是一個特定類型的類。全部枚舉都是Java中的新類java.lang.Enum的隱式子類。此類不能手工進行子類定義。一個簡單的枚舉能夠是這樣:排序

  

  上面的Entity類就能夠改爲這樣:

  

  在爲Entity對象賦值的時候,就能夠這樣:

  

  怎麼看,都是好了不少。在調用setType()時,可選值只有四個,不然會出現編譯錯誤,所以能夠看出,枚舉是類型安全的,不會出現取值範圍錯誤的問題。同時,客戶端不須要創建對枚舉中常量值的瞭解,使用起來很方便,而且能夠容易地對枚舉進行修改,而無需修改客戶端。若是常量從枚舉中被刪除了,那麼客戶端將會失敗而且將會收到一個錯誤消息。枚舉中的常量名稱能夠被打印,所以除了僅僅獲得列表中項的序號外還能夠獲取更多信息。

  二:枚舉的語法定義

    建立枚舉類型要使用 enum 關鍵字,隱含了所建立的類型都是 java.lang.Enum 類的子類(java.lang.Enum 是一個抽象類)。枚舉類型符合通用模式 Class Enum<E extends Enum<E>>,而 E 表示枚舉類型的名稱。枚舉類型的每個值都將映射到 protected Enum(String name, int ordinal) 構造函數中,在這裏,每一個值的名稱都被轉換成一個字符串,而且序數設置表示了此設置被建立的順序。

  

  這段代碼實際上調用了7次 Enum(String name, int ordinal):

  

  三:枚舉的例子

  例一:

  

  例二:

  

 

  都是當前枚舉類的實例。

相關文章
相關標籤/搜索