日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java 语言中 Enum 类型的使用介绍

發(fā)布時間:2025/3/21 java 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java 语言中 Enum 类型的使用介绍 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Enum 類型的介紹

枚舉類型(Enumerated Type) 很早就出現(xiàn)在編程語言中,它被用來將一組類似的值包含到一種類型當中。而這種枚舉類型的名稱則會被定義成獨一無二的類型描述符,在這一點上和常量的定義相似。不過相比較常量類型,枚舉類型可以為申明的變量提供更大的取值范圍。

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

清單 1. 常量定義
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; }

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

  • 類型不安全
  • 由于顏色常量的對應值是整數(shù)形,所以程序執(zhí)行過程中很有可能給顏色變量傳入一個任意的整數(shù)值,導致出現(xiàn)錯誤。

  • 沒有命名空間
  • 由于顏色常量只是類的屬性,當你使用的時候不得不通過類來訪問。

  • 一致性差
  • 因為整形枚舉屬于編譯期常量,所以編譯過程完成后,所有客戶端和服務器端引用的地方,會直接將整數(shù)值寫入。這樣,當你修改舊的枚舉整數(shù)值后或者增加新的枚舉值后,所有引用地方代碼都需要重新編譯,否則運行時刻就會出現(xiàn)錯誤。

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

    如何定義 Enum 類型

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

    enum RainbowColor { RED, ORANGE, YELLOW, GREEN, CYAN, BLUE, PURPLE }

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

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

    清單 2. 定義 Enum 類型
    // 定義一周七天的枚舉類型 public enum WeekDayEnum { Mon, Tue, Wed, Thu, Fri, Sat, Sun } // 讀取當天的信息WeekDayEnum today = readToday(); // 根據(jù)日期來選擇進行活動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 都會在運行期構(gòu)造成出一個簡單的對象實例一一對應。這些對象都有唯一的 identity,類似整形數(shù)值一樣,switch 語句就根據(jù)此來進行執(zhí)行跳轉(zhuǎn)。

    如何定制 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; // 枚舉對象構(gòu)造函數(shù)private NewsRSSFeedEnum(String rss) { this.rss_url = rss; } // 枚舉對象獲取 RSS 地址的方法public String getRssURL() { return this.rss_url; } }

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

    如何避免錯誤使用 Enum

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

  • enum 類型不支持 public 和 protected 修飾符的構(gòu)造方法,因此構(gòu)造函數(shù)一定要是 private 或 friendly 的。也正因為如此,所以枚舉對象是無法在程序中通過直接調(diào)用其構(gòu)造方法來初始化的。
  • 定義 enum 類型時候,如果是簡單類型,那么最后一個枚舉值后不用跟任何一個符號;但如果有定制方法,那么最后一個枚舉值與后面代碼要用分號';'隔開,不能用逗號或空格。
  • 由于 enum 類型的值實際上是通過運行期構(gòu)造出對象來表示的,所以在 cluster 環(huán)境下,每個虛擬機都會構(gòu)造出一個同義的枚舉對象。因而在做比較操作時候就需要注意,如果直接通過使用等號 ( ‘ == ’ ) 操作符,這些看似一樣的枚舉值一定不相等,因為這不是同一個對象實例。
  • 看下面的這個例子:

    清單 4. 避免錯誤使用 Enum 示例
    // 定義一個一周七天的枚舉類型package example.enumeration.codes; public enum WeekDayEnum { Mon(1), Tue(2), Wed(3), Thu(4), Fri(5), Sat(6), Sun(7); private int index; WeekDayEnum(int idx) { this.index = idx; } public int getIndex() { return index; } } // 客戶端程序,將一個枚舉值通過網(wǎng)絡傳遞給服務器端package example.enumeration.codes; import java.io.IOException; import java.io.ObjectOutputStream; import java.io.OutputStream; import java.net.InetSocketAddress; import java.net.Socket; import java.net.UnknownHostException; public class EnumerationClient { public static void main(String... args) throws UnknownHostException, IOException { Socket socket = new Socket(); // 建立到服務器端的連接socket.connect(new InetSocketAddress("127.0.0.1", 8999)); // 從連接中得到輸出流OutputStream os = socket.getOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(os); // 將星期五這個枚舉值傳遞給服務器端oos.writeObject(WeekDayEnum.Fri); oos.close(); os.close(); socket.close(); } } // 服務器端程序,將從客戶端收到的枚舉值應用到邏輯處理中package example.enumeration.codes; import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class EnumerationServer { public static void main(String... args) throws IOException, ClassNotFoundException { ServerSocket server = new ServerSocket(8999); // 建立服務器端的網(wǎng)絡連接偵聽Socket socket = server.accept(); // 從連接中獲取輸入流InputStream is = socket.getInputStream(); ObjectInputStream ois = new ObjectInputStream(is); // 讀出客戶端傳遞來的枚舉值WeekDayEnum day = (WeekDayEnum) ois.readObject(); // 用值比較方式來對比枚舉對象if (day == WeekDayEnum.Fri) { System.out.println("client Friday enum value is same as server's"); } else if (day.equals(WeekDayEnum.Fri)) { System.out.println("client Friday enum value is equal to server's"); } else { System.out.println("client Friday enum value is not same as server's"); } // 用 switch 方式來比較枚舉對象switch (day) { case Mon: System.out.println("Do Monday work"); break; case Tue: System.out.println("Do Tuesday work"); break; case Wed: System.out.println("Do Wednesday work"); break; case Thu: System.out.println("Do Thursday work"); break; case Fri: System.out.println("Do Friday work"); break; case Sat: System.out.println("Do Saturday work"); break; case Sun: System.out.println("Do Sunday work"); break; default: System.out.println("I don't know which is day"); break; } ois.close(); is.close(); socket.close(); } }

    打印結(jié)果如下:

    client Friday enum value is same as server's Do Friday work

    通過程序執(zhí)行結(jié)果,我們能夠發(fā)現(xiàn)在分布式條件下客戶端和服務端的虛擬機上都生成了一個枚舉對象,即使看起來一樣的 Fri 枚舉值,如果使用等號‘ == ’進行比較的話會出現(xiàn)不等的情況。而 switch 語句則是通過 equal 方法來比較枚舉對象的值,因此當你的枚舉對象較復雜時候,你就需要小心 override 與比較相關(guān)的方法,防止出現(xiàn)值比較方面的錯誤。

    Enum 相關(guān)工具類

    JDK5.0 中在增加 Enum 類的同時,也增加了兩個工具類 EnumSet 和 EnumMap,這兩個類都放在 java.util 包中。EnumSet 是一個針對枚舉類型的高性能的 Set 接口實現(xiàn)。EnumSet 中裝入的所有枚舉對象都必須是同一種類型,在其內(nèi)部,是通過 bit-vector 來實現(xiàn),也就是通過一個 long 型數(shù)。EnumSet 支持在枚舉類型的所有值的某個范圍中進行迭代。回到上面日期枚舉的例子上:

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

    你能夠在每周七天日期中進行迭代,EnumSet 類提供一個靜態(tài)方法 range 讓迭代很容易完成:

    for(WeekDayEnum day : EnumSet.range(WeekDayEnum.Mon, WeekDayEnum.Fri)) { System.out.println(day); }

    打印結(jié)果如下:

    Mon Tue Wed Thu Fri

    EnumSet 還提供了很多個類型安全的獲取子集的 of 方法,使你很容易取得子集:

    EnumSet<WeekDayEnum> subset = EnumSet.of(WeekDayEnum.Mon, WeekDayEnum.Wed); for (WeekDayEnum day : subset) { System.out.println(day); }

    打印結(jié)果如下:

    Mon Wed

    與 EnumSet 類似,EnumMap 也是一個高性能的 Map 接口實現(xiàn),用來管理使用枚舉類型作為 keys 的映射表,內(nèi)部是通過數(shù)組方式來實現(xiàn)。EnumMap 將豐富的和安全的 Map 接口與數(shù)組快速訪問結(jié)合到一起,如果你希望要將一個枚舉類型映射到一個值,你應該使用 EnumMap。看下面的例子:

    清單 5. EnumMap 示例
    // 定義一個 EnumMap 對象,映射表主鍵是日期枚舉類型,值是顏色枚舉類型private static Map<WeekDayEnum, RainbowColor> schema = new EnumMap<WeekDayEnum, RainbowColor>(WeekDayEnum.class); static{ // 將一周的每一天與彩虹的某一種色彩映射起來for (int i = 0; i < WeekDayEnum.values().length; i++) { schema.put(WeekDayEnum.values()[i], RainbowColor.values()[i]); } } System.out.println("What is the lucky color today?"); System.out.println("It's " + schema.get(WeekDayEnum.Sat));

    當你詢問周六的幸運色彩時候,會得到藍色:

    清單 6. 運行結(jié)果
    What is the lucky color today? It's BLUE

    結(jié)束語

    Enum 類型提出給 JAVA 編程帶了了極大的便利,讓程序的控制更加的容易,也不容易出現(xiàn)錯誤。所以在遇到需要控制程序流程時候,可以多想想是否可以利用 enum 來實現(xiàn)。

    參考資料

    學習

    • The Java Language Specification,Java 語言規(guī)范描述。
    • Enum 類的接口說明,Java 接口文檔描述。
    • developerWorks Java 技術(shù)專區(qū):這里有數(shù)百篇關(guān)于 Java 編程各個方面的文章。

    討論

    • 加入?developerWorks 中文社區(qū)。查看開發(fā)人員推動的博客、論壇、組和維基,并與其他 developerWorks 用戶交流。
    from:?https://www.ibm.com/developerworks/cn/java/j-lo-enum/

    總結(jié)

    以上是生活随笔為你收集整理的Java 语言中 Enum 类型的使用介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 日韩国产一区二区三区 | 久久视频热 | 欧美v视频 | 毛片在线视频播放 | 天堂网www在线 | 91成品人影院 | 91av亚洲 | 精品国产无码一区二区 | 国产精品12区 | 天天插天天色 | 欧美一级在线观看 | 免费在线观看一区 | 色婷婷综合久久久久中文 | 久久亚洲精华国产精华液 | 亚色视频在线 | 免费看黄色片子 | 99国产精品久久久久久久成人 | 亚洲精品激情视频 | 欧美综合视频 | av丝袜在线观看 | 黄色成人免费网站 | 精品国产一二三 | 欧美囗交做爰视频 | 草免费视频 | 久久国产这里只有精品 | 不许穿内裤随时挨c调教h苏绵 | 亚洲成人中文字幕 | 国产成人精品一区二区三区免费 | 日日夜夜狠 | julia中文字幕在线 | 亚洲国产精品成人综合久久久 | 日日夜夜精品视频 | 成人激情四射网 | 少妇喷白浆 | 激情一区二区 | 欧美精品一区二区三区久久 | 撕开少妇裙子猛然进入 | 色欲亚洲Av无码精品天堂 | 亚洲国产欧美在线人成 | 久久精品5 | 日本黄色大片网站 | 性猛交娇小69hd | 日韩电影网站 | 亚洲综合在线一区二区 | 嫩草伊人久久精品少妇av | 天天爽天天干 | 中文字幕日韩欧美 | 夫の上司に犯波多野结衣853 | 欧美日韩不卡在线 | 亚洲精品视频播放 | 麻豆传媒网站在线观看 | jizz中文字幕 | 亚洲av无码专区国产乱码不卡 | 日韩在线视频看看 | 欧美性猛交99久久久久99按摩 | 性欧美videossex精品 | 欧美色精品 | 成人在线视频免费观看 | www.四虎在线观看 | 午夜影院性| 亚洲成人自拍偷拍 | 国产精品jizz在线观看老狼 | 欧美精品久久久久久久自慰 | 色多多导航 | 国产精品夜夜夜爽张柏芝 | 一本久道视频一本久道 | a黄视频 | 九一精品国产 | 九九超碰 | 欧美电影一区二区三区 | 久久久久无码国产精品不卡 | 亚洲欧美日韩偷拍 | 看黄色一级视频 | 国产精品久久久久久亚洲色 | 天天拍天天色 | 俺去草 | 性的免费视频 | 国产视频一区二区三区四区 | 一区二区片 | 久久久久人 | 桃色网址 | 男生操女生网站 | 日本大尺度电影免费观看全集中文版 | 免费人妻一区二区三区 | 福利社91 | 黑人精品欧美一区二区蜜桃 | 99久久精品免费看 | 中国爆后菊女人的视频 | 日本黄色免费网站 | 欧美日本三级 | www.色com | 成人精品一区二区三区中文字幕 | 日p免费视频 | 色婷婷久久久 | 狠狠干影院 | 亚洲综合丁香 | 亚洲av无码一区二区三区网址 | 国产一区二区视频在线播放 | 色综合综合网 |