溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

java學(xué)習(xí)中如何使用Enum類(lèi)型

發(fā)布時(shí)間:2020-07-15 09:40:43 來(lái)源:億速云 閱讀:142 作者:Leah 欄目:編程語(yǔ)言

這篇文章運(yùn)用簡(jiǎn)單易懂的例子給大家介紹java學(xué)習(xí)中如何使用Enum類(lèi)型,代碼非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

一、Enum 類(lèi)型的介紹

枚舉類(lèi)型(Enumerated Type) 很早就出現(xiàn)在編程語(yǔ)言中,它被用來(lái)將一組類(lèi)似的值包含到一種類(lèi)型當(dāng)中。而這種枚舉類(lèi)型的名稱(chēng)則會(huì)被定義成獨(dú)一無(wú)二的類(lèi)型描述符,在這一點(diǎn)上和常量的定義相似。不過(guò)相比較常量類(lèi)型,枚舉類(lèi)型可以為聲明的變量提供更大的取值范圍。

舉個(gè)例子來(lái)說(shuō)明一下,如果希望為彩虹描繪出七種顏色,你可以在 Java 程序中通過(guò)常量定義方式來(lái)實(shí)現(xiàn)。

Public static class RainbowColor { 
    
   // 紅橙黃綠青藍(lán)紫七種顏色的常量定義
   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; 
}

使用的時(shí)候,你可以在程序中直接引用這些常量。但是,這種方式還是存在著一些問(wèn)題。

類(lèi)型不安全

由于顏色常量的對(duì)應(yīng)值是整數(shù)形,所以程序執(zhí)行過(guò)程中很有可能給顏色變量傳入一個(gè)任意的整數(shù)值,導(dǎo)致出現(xiàn)錯(cuò)誤。

沒(méi)有命名空間

由于顏色常量只是類(lèi)的屬性,當(dāng)你使用的時(shí)候不得不通過(guò)類(lèi)來(lái)訪問(wèn)。

一致性差

因?yàn)檎蚊杜e屬于編譯期常量,所以編譯過(guò)程完成后,所有客戶(hù)端和服務(wù)器端引用的地方,會(huì)直接將整數(shù)值寫(xiě)入。這樣,當(dāng)你修改舊的枚舉整數(shù)值后或者增加新的枚舉值后,所有引用地方代碼都需要重新編譯,否則運(yùn)行時(shí)刻就會(huì)出現(xiàn)錯(cuò)誤。

類(lèi)型無(wú)指意性

由于顏色枚舉值僅僅是一些無(wú)任何含義的整數(shù)值,如果在運(yùn)行期調(diào)試時(shí)候,你就會(huì)發(fā)現(xiàn)日志中有很多魔術(shù)數(shù)字,但除了程序員本身,其他人很難明白其意義。

二、如何定義 Enum 類(lèi)型

    為了改進(jìn) Java 語(yǔ)言在這方面的不足彌補(bǔ)缺陷,5.0 版本 SDK 發(fā)布時(shí)候,在語(yǔ)言層面上增加了枚舉類(lèi)型。枚舉類(lèi)型的定義也非常的簡(jiǎn)單,用 enum 關(guān)鍵字加上名稱(chēng)和大括號(hào)包含起來(lái)的枚舉值體即可,例如上面提到的彩虹顏色就可以用新的 enum 方式來(lái)重新定義:

java學(xué)習(xí)中如何使用Enum類(lèi)型

從上面的定義形式來(lái)看,似乎 Java 中的枚舉類(lèi)型很簡(jiǎn)單,但實(shí)際上 Java 語(yǔ)言規(guī)范賦予枚舉類(lèi)型的功能非常的強(qiáng)大,它不僅是簡(jiǎn)單地將整形數(shù)值轉(zhuǎn)換成對(duì)象,而是將枚舉類(lèi)型定義轉(zhuǎn)變成一個(gè)完整功能的類(lèi)定義。這種類(lèi)型定義的擴(kuò)展允許開(kāi)發(fā)者給枚舉類(lèi)型增加任何方法和屬性,也可以實(shí)現(xiàn)任意的接口。另外,Java 平臺(tái)也為 Enum 類(lèi)型提供了高質(zhì)量的實(shí)現(xiàn),比如默認(rèn)實(shí)現(xiàn) Comparable 和 Serializable 接口,讓開(kāi)發(fā)者一般情況下不用關(guān)心這些細(xì)節(jié)。

回到本文的主題上來(lái),引入枚舉類(lèi)型到底能夠給我們開(kāi)發(fā)帶來(lái)什么樣好處呢?一個(gè)最直接的益處就是擴(kuò)大 switch 語(yǔ)句使用范圍。5.0 之前,Java 中 switch 的值只能夠是簡(jiǎn)單類(lèi)型,比如 int、byte、short、char, 有了枚舉類(lèi)型之后,就可以使用對(duì)象了。這樣一來(lái),程序的控制選擇就變得更加的方便,看下面的例子:

定義 Enum 類(lèi)型

// 定義一周七天的枚舉類(lèi)型         
public enum WeekDayEnum { Mon, Tue, Wed, Thu, Fri, Sat, Sun } 
 
// 讀取當(dāng)天的信息
WeekDayEnum today = readToday(); 
 
// 根據(jù)日期來(lái)選擇進(jìn)行活動(dòng)
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; 
}

對(duì)于這些枚舉的日期,JVM 都會(huì)在運(yùn)行期構(gòu)造成出一個(gè)簡(jiǎn)單的對(duì)象實(shí)例一一對(duì)應(yīng)。這些對(duì)象都有唯一的 identity,類(lèi)似整形數(shù)值一樣,switch 語(yǔ)句就根據(jù)此來(lái)進(jìn)行執(zhí)行跳轉(zhuǎn)。

如何定制 Enum 類(lèi)型

除了以上這種最常見(jiàn)的枚舉定義形式外,如果需要給枚舉類(lèi)型增加一些復(fù)雜功能,也可以通過(guò)類(lèi)似 class 的定義來(lái)給枚舉進(jìn)行定制。比如要給 enum 類(lèi)型增加屬性,可以像下面這樣定義:

// 定義 RSS(Really Simple Syndication) 種子的枚舉類(lèi)型
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>"), 
    
   // 洛杉磯時(shí)報(bào)頭條新聞 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>"); 
        
   // 枚舉對(duì)象的 RSS 地址的屬性
   private String rss_url; 
        
   // 枚舉對(duì)象構(gòu)造函數(shù)
   private NewsRSSFeedEnum(String rss) { 
       this.rss_url = rss; 
   } 
        
   // 枚舉對(duì)象獲取 RSS 地址的方法
   public String getRssURL() { 
       return this.rss_url; 
   } 
}

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

關(guān)于java學(xué)習(xí)中如何使用Enum類(lèi)型就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI