JAVA列舉的作用與好處
原創地址:http://blog.sina.com.cn/s/blog_4adc4b090101dtxp.html
列舉是一種規範它規範了引數的形式,這樣就可以不用考慮型別的不匹配並且顯式的替代了int型引數可能帶來的模糊概念 列舉像一個類,又像一個陣列。 Enum作為Sun全新引進的一個關鍵字,看起來很象是特殊的class, 它也可以有自己的變數,可以定義自己的方法,可以實現一個或者多個介面。 當我們在宣告一個enum型別時,我們應該注意到enum型別有如下的一些特徵。 1.它不能有public的建構函式,這樣做可以保證客戶程式碼沒有辦法新建一個enum的例項。 2.所有列舉值都是public , static , final的。注意這一點只是針對於列舉值,我們可以和在普通類裡面定義 變數一樣定義其它任何型別的非列舉變數,這些變數可以用任何你想用的修飾符。 3.Enum預設實現了java.lang.Comparable介面。 4.Enum覆載了了toString方法,因此我們如果呼叫Color.Blue.toString()預設返回字串”Blue”. 5.Enum提供了一個valueOf方法,這個方法和toString方法是相對應的。呼叫valueOf(“Blue”)將返回Color.Blue.因此我們在自己重寫toString方法的時候就要注意到這一點,一把來說應該相對應地重寫valueOf方法。 6.Enum還提供了values方法,這個方法使你能夠方便的遍歷所有的列舉值。 7.Enum還有一個oridinal的方法,這個方法返回列舉值在列舉類種的順序,這個順序根據列舉值宣告的順序而定,這裡Color.Red.ordinal()返回0。 瞭解了這些基本特性,我們來看看如何使用它們。 1.遍歷所有有列舉值. 知道了有values方法,我們可以輕車熟路地用ForEach迴圈來遍歷了列舉值了。 for (Color c: Color.values()) System.out.println(“find value:” + c); 2.在enum中定義方法和變數,比如我們可以為Color增加一個方法隨機返回一個顏色。 public enum Color { Red, Green, Blue; private static int number = Color.values().length ; public static Color getRandomColor(){ long random = System.currentTimeMillis() % number; switch ((int) random){ case 0: return Color.Red; case 1: return Color.Green; case 2: return Color.Blue; default : return Color.Red; } } } 可以看出這在列舉型別裡定義變數和方法和在普通類裡面定義方法和變數沒有什麼區別。唯一要注意的只是變數和方法定義必須放在所有列舉值定義的後面,否則編譯器會給出一個錯誤。 3.覆載(Override)toString, valueOf方法 前面我們已經知道enum提供了toString,valueOf等方法,很多時候我們都需要覆載預設的toString方法,那麼對於enum我們怎麼做呢。其實這和覆載一個普通class的toString方法沒有什麼區別。 …. public String toString(){ switch (this){ case Red: return "Color.Red"; case Green: return "Color.Green"; case Blue: return "Color.Blue"; default: return "Unknow Color"; } } …. 這時我們可以看到,此時再用前面的遍歷程式碼列印出來的是 Color.Red Color.Green Color.Blue 而不是 Red Green Blue. 可以看到toString確實是被覆載了。一般來說在覆載toString的時候我們同時也應該覆載valueOf方法,以保持它們相互的一致性。 4.使用建構函式 雖然enum不可以有public的建構函式,但是我們還是可以定義private的建構函式,在enum內部使用。還是用Color這個例子。 public enum Color { Red("This is Red"), Green("This is Green"), Blue("This is Blue"); private String desc; Color(String desc){ this.desc = desc; } public String getDesc(){ return this.desc; } } 這裡我們為每一個顏色提供了一個說明資訊, 然後定義了一個建構函式接受這個說明資訊。 要注意這裡建構函式不能為public或者protected, 從而保證建構函式只能在內部使用,客戶程式碼不能new一個列舉值的例項出來。這也是完全符合情理的,因為我們知道列舉值是public static final的常量而已。 5.實現特定的介面 我們已經知道enum可以定義變數和方法,它要實現一個介面也和普通class實現一個介面一樣,這裡就不作示例了。 6.定義列舉值自己的方法。 前面我們看到可以為enum定義一些方法,其實我們甚至可以為每一個列舉值定義方法。這樣,我們前面覆載 toString的例子可以被改寫成這樣。 public enum Color { Red { public String toString(){ return "Color.Red"; } }, Green { public String toString(){ return "Color.Green"; } }, Blue{ public String toString(){ return "Color.Blue"; } }; } 從邏輯上來說這樣比原先提供一個“全域性“的toString方法要清晰一些。 總的來說,enum作為一個全新定義的型別,是希望能夠幫助程式設計師寫出的程式碼更加簡單易懂,個 人覺得一般也不需要過多的使用enum的一些高階特性,否則就和簡單易懂的初衷想違背了。
相關文章
- SerializationFeature各列舉項的作用
- Java列舉Java
- Java 列舉、JPA 和 PostgreSQL 列舉JavaSQL
- java中的列舉Java
- MapperFeature各列舉項的作用APP
- Java基礎(十)——列舉與註解Java
- Java 列舉 switch的用法Java
- Java 列舉(enum)Java
- java列舉類Java
- Java列舉使用Java
- 用列舉來處理java自定義異常Java
- Java列舉-通過值查詢對應的列舉Java
- Java enum列舉類詳解 列舉的常見用法Java
- 【java基礎】--Java列舉Java
- JsonParser.Feature各列舉項的作用JSON
- java中的列舉型別Java型別
- Java基礎--列舉Java
- 【java基礎】列舉Java
- Java(4)列舉類Java
- 【java】【列舉使用技巧】Java
- Java列舉解讀Java
- java列舉型別Java型別
- java 列舉型別Java型別
- C# 列舉與位列舉概述C#
- ?Java基礎之Java列舉Java
- golang 常量與列舉Golang
- Java列舉類與註解詳解——一篇文章讀懂列舉類與註解詳Java
- 聊一聊Java的列舉enumJava
- 深入理解 Java 列舉Java
- Java - Enum 列舉型別Java型別
- Java —— 列舉類(enum 類)Java
- java_06列舉類Java
- Java 列舉 enum 詳解Java
- JAVA(四)類集/列舉Java
- java基礎:enum列舉Java
- java中列舉(Enum)使用Java
- JAVA列舉使用詳解Java
- 再談java列舉enumJava