Enum 類型

枚舉類型(Enumerated Type)被用來將一組類似的值包含到一種類型當中。而這種枚舉類型的名稱則會被定義成獨一無二的類型描述符,在這一點上和常量的定義相似。不過相比較常量類型,枚舉類型可以爲申明的變量提供更大的取值範圍。

 

如何定義 Enum 類型

 

枚舉類型的定義也非常的簡單,用 enum 關鍵字加上名稱和大括號包含起來的枚舉值體即可,彩虹顏色就可以用新的 enum 方式來重新定義:

 enumRainbowColor { RED, ORANGE, YELLOW, GREEN, CYAN, BLUE, PURPLE }

枚舉類型不僅是簡單地將整形數值轉換成對象,而是將枚舉類型定義轉變成一個完整功能的類定義。這種類型定義的擴展允許開發者給枚舉類型增加任何方法和屬性,也可以實現任意的接口。另外,Java 平臺也爲 Enum 類型提供了高質量的實現,比如默認實現 Comparable 和 Serializable 接口,讓開發者一般情況下不用關心這些細節。

一個最直接的益處就是擴大 switch 語句使用範圍。

清單 2. 定義 Enum 類型

 // 定義一週七天的枚舉類型                 

 public enum WeekDayEnum { Mon, Tue, Wed, Thu,Fri, Sat, Sun }

 

 // 讀取當天的信息

 WeekDayEnum today = readToday();

 

 // 根據日期來選擇進行活動

 switch(today) {

 Mon: do something; break;

 Tue: do something; break;

 Wed: do something; break;

 Thu: do something; break;

 Fri: do something; break;

 Sat: play sports game; break;

 Sun: have a rest; break;

 }

如何定製 Enum 類型

 

除了以上這種最常見的枚舉定義形式外,如果需要給枚舉類型增加一些複雜功能,也可以通過類似 class 的定義來給枚舉進行定製。比如要給 enum 類型增加屬性,可以像下面這樣定義:

清單 3. 定製枚舉類型

 // 定義 RSS(Really Simple Syndication) 種子的枚舉類型

 public enum NewsRSSFeedEnum {

   // 雅虎頭條新聞 RSS 種子

   YAHOO_TOP_STORIES("http://rss.news.yahoo.com/rss/topstories"),

   

   //CBS 頭條新聞 RSS 種子

   CBS_TOP_STORIES("http://feeds.cbsnews.com/CBSNewsMain?format=xml"),

   

   // 洛杉磯時報頭條新聞 RSS 種子

   LATIMES_TOP_STORIES("http://feeds.latimes.com/latimes/news?format=xml");

       

   // 枚舉對象的 RSS 地址的屬性

   private String rss_url;

       

   // 枚舉對象構造函數

   private NewsRSSFeedEnum(String rss) {

       this.rss_url = rss;

    }

       

   // 枚舉對象獲取 RSS 地址的方法

   public String getRssURL() {

       return this.rss_url;

    }

 }

上面頭條新聞的枚舉類型增加了一個 RSS 地址的屬性 , 記錄頭條新聞的訪問地址。同時,需要外部傳入 RSS 訪問地址的值,因而需要定義一個構造函數來初始化此屬性。另外,還需要向外提供方法來讀取 RSS 地址。

 

如何避免錯誤使用 Enum

 

不過在使用 Enum 時候有幾個地方需要注意:

1.       enum 類型不支持 public 和protected 修飾符的構造方法,因此構造函數一定要是 private 或 friendly 的。也正因爲如此,所以枚舉對象是無法在程序中通過直接調用其構造方法來初始化的。

2.       定義 enum 類型時候,如果是簡單類型,那麼最後一個枚舉值後不用跟任何一個符號;但如果有定製方法,那麼最後一個枚舉值與後面代碼要用分號';'隔開,不能用逗號或空格。

3.       由於 enum 類型的值實際上是通過運行期構造出對象來表示的,所以在 cluster 環境下,每個虛擬機都會構造出一個同義的枚舉對象。因而在做比較操作時候就需要注意,如果直接通過使用等號 ( ‘ == ’ ) 操作符,這些看似一樣的枚舉值一定不相等,因爲這不是同一個對象實例。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章