Java中的枚舉類型


  一:枚舉的引入

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

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

  那么在枚舉出現之前,如果想表示一組特定的離散值,往往使用一些常量。例如:

  

  當然,常量也不僅僅局限於int型,諸如char和String等也是不在少數。然而,無論使用什么樣的類型,這樣做都有很多的壞處。這些常量通常都是連續、有無窮多個值的量,而類似這種表示類別的量則是離散的,並且通常情況下只有有限個值。用連續的量去表示離散量,會產生很多問題。例如,針對上述的Entity類,如果要對Entity對象的type屬性進行賦值,一般會采用如下方法:

  

  這樣做的缺點有:(1)代碼可讀性差、易用性低。由於setType()方法的參數是int型的,在閱讀代碼的時候往往會讓讀者感到一頭霧水,根本不明白這個2到底是什么意思,代表的是什么類型。當然,要保證可讀性,還有這樣一個辦法:

  

  而這樣的話,問題又來了。這樣做,客戶端必須對這些常量去建立理解,才能了解如何去使用這個東西。說白了,在調用的時候,如果用戶不到Entity類中去看看,還真不知道這個參數應該怎么傳、怎么調。像是setType(2)這種用法也是在所難免,因為它完全合法,不是每個人都能夠建立起用常量名代替數值,從而增加程序可讀性、降低耦合性的意識。

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

  (3)耦合性高,擴展性差。假如,因為某些原因,需要修改Entity類中常量的值,那么,所有用到這些常量的代碼也就都需要修改——當然,要仔細地修改,萬一漏了一個,那可不是開玩笑的。同時,這樣做也不利於擴展。例如,假如針對類別做了一個有效性驗證,如果類別增加了或者有所變動,則有效性驗證也需要做對應的修改,不利於后期維護。

  枚舉就是為了這樣的問題而誕生的。它們給出了將一個任意項同另一個項相比較的能力,並且可以在一個已定義項列表中進行迭代。枚舉(在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):

  

  三:枚舉的例子

  例一:

  

  例二:

  

 

  都是當前枚舉類的實例。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com