本篇文章帶給大家的內容是介紹在java中如何使用Enum 類型。有一定的參考價值,有需要的朋友可以參考一下,希望對你們有幫助。
一、Enum 類型的介紹
枚舉類型(Enumerated Type) 很早就出現在程式語言中,它被用來將一組類似的值包含到一個類型當中。而這種枚舉類型的名稱會被定義成獨一無二的類型描述符,在這一點上和常數的定義相似。不過相比較常數類型,枚舉類型可以為聲明的變數提供更大的取值範圍。
舉個例子來說明一下,如果希望為彩虹描繪七種顏色,你可以在 Java 程式中透過常數定義方式來實現。
Public static class RainbowColor { // 红橙黄绿青蓝紫七种颜色的常量定义 public static final int RED = 0; public static final int ORANGE = 1; public static final int YELLOW = 2; public static final int GREEN = 3; public static final int CYAN = 4; public static final int BLUE = 5; public static final int PURPLE = 6; }
使用的時候,你可以在程式中直接引用這些常數。但是,這種方式還是存在著一些問題。
類型不安全
#由於顏色常數的對應值是整數形,所以程式執行過程中很有可能會給顏色變數傳入一個任意的整數值,導致出現錯誤。
沒有命名空間
#由於顏色常數只是類別的屬性,當你使用的時候不得不透過類別來存取。
一致性差
#因為整形枚舉屬於編譯期常數,所以編譯過程完成後,所有客戶端和伺服器端引用的地方,會直接將整數值寫入。這樣,當你修改舊的枚舉整數值後或增加新的枚舉值後,所有引用地方程式碼都需要重新編譯,否則運行時刻就會出現錯誤。
類型無指意性
#由於顏色枚舉值只是一些無任何意義的整數值,如果在運行期調試時候,你會發現日誌中有很多魔術數字,但除了程式設計師本身,其他人很難明白其意義#。
二、如何定義Enum 類型
為了改進Java 語言在這方面的不足彌補缺陷,5.0 版本SDK 發佈時候,在語言層面上增加了枚舉類型。枚舉類型的定義也非常的簡單,用enum 關鍵字加上名稱和大括號包含起來的枚舉值體即可,例如上面提到的彩虹顏色就可以用新的enum 方式來重新定義:
從上面的定義形式來看,似乎Java 中的枚舉類型很簡單,但實際上Java 語言規範賦予枚舉類型的函數非常的強大,它不僅是簡單地將整形數值轉換成對象,而是將枚舉類型定義轉變成一個完整功能的類別定義。這種類型定義的擴充功能允許開發者為枚舉類型增加任何方法和屬性,也可以實作任意的介面。 另外,Java 平台也為Enum 類型提供了高品質的實現,例如預設實作Comparable 和Serializable 接口,讓開發者一般情況下不用關心這些細節。
回到本文的主题上来,引入枚举类型到底能够给我们开发带来什么样好处呢?一个最直接的益处就是扩大 switch 语句使用范围。5.0 之前,Java 中 switch 的值只能够是简单类型,比如 int、byte、short、char, 有了枚举类型之后,就可以使用对象了。这样一来,程序的控制选择就变得更加的方便,看下面的例子:
定义 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; }
对于这些枚举的日期,JVM 都会在运行期构造成出一个简单的对象实例一一对应。这些对象都有唯一的 identity,类似整形数值一样,switch 语句就根据此来进行执行跳转。
如何定制 Enum 类型
除了以上这种最常见的枚举定义形式外,如果需要给枚举类型增加一些复杂功能,也可以通过类似 class 的定义来给枚举进行定制。比如要给 enum 类型增加属性,可以像下面这样定义:
// 定义 RSS(Really Simple Syndication) 种子的枚举类型 public enum NewsRSSFeedEnum { // 雅虎头条新闻 RSS 种子 YAHOO_TOP_STORIES("<a href="http://rss.news.yahoo.com/rss/topstories"><code>http://rss.news.yahoo.com/rss/topstories</code></a>"), //CBS 头条新闻 RSS 种子 CBS_TOP_STORIES("<a href="http://feeds.cbsnews.com/CBSNewsMain?format=xml"><code>http://feeds.cbsnews.com/CBSNewsMain?format=xml</code></a>"), // 洛杉矶时报头条新闻 RSS 种子 LATIMES_TOP_STORIES("<a href="http://feeds.latimes.com/latimes/news?format=xml"><code>http://feeds.latimes.com/latimes/news?format=xml</code></a>"); // 枚举对象的 RSS 地址的属性 private String rss_url; // 枚举对象构造函数 private NewsRSSFeedEnum(String rss) { this.rss_url = rss; } // 枚举对象获取 RSS 地址的方法 public String getRssURL() { return this.rss_url; } }
上面头条新闻的枚举类型增加了一个 RSS 地址的属性 , 记录头条新闻的访问地址。同时,需要外部传入 RSS 访问地址的值,因而需要定义一个构造函数来初始化此属性。另外,还需要向外提供方法来读取 RSS 地址。
以上是java基礎學習如何使用Enum類型的詳細內容。更多資訊請關注PHP中文網其他相關文章!