java enum(枚舉)的使用

来源:http://www.cnblogs.com/0201zcr/archive/2016/01/06/5104497.html
-Advertisement-
Play Games

在實際編程中,往往存在著這樣的“數據集”,它們的數值在程式中是穩定的,而且“數據集”中的元素是有限的。 例如星期一到星期日七個數據元素組成了一周的“數據集”,春夏秋冬四個數據元素組成了四季的“數據集”。 enum 的全稱為 enumeration, 是 JDK 1.5 中引入的新特性,存放在...


  在實際編程中,往往存在著這樣的“數據集”,它們的數值在程式中是穩定的,而且“數據集”中的元素是有限的。

  例如星期一到星期日七個數據元素組成了一周的“數據集”,春夏秋冬四個數據元素組成了四季的“數據集”。

  enum 的全稱為 enumeration, 是 JDK 1.5  中引入的新特性,存放在 java.lang 包中,在上面的這種情況下,enum就能派上用場了。枚舉類型的用途不僅如此,具體可用場景可看下麵的介紹

1、常量

  以前我們定義一個常量通常都是使用 public static final …… 定義的,如下麵:

public static final CONSTANT_STR = "TEST";

  或者使用介面定義的變數,因為介面定義的變數預設都是public static final,如下:

/**
 * 星期的常量介面
 */
public interface IWeekConstants {
    String MON = "Mon";
    String TUE = "Tue";
    String WED = "Wed";
    String THU = "Thu";
    String FRI = "Fri";
    String SAT = "Sat";
    String SUN = "Sun";
}

  有了枚舉我們可以使用下麵的方式:

public enum WeekEnum {
    MON, TUE, WED, THU, FRI, SAT, SUN;
}

  解釋:創建枚舉類型要使用 enum 關鍵字,隱含了所創建的類型都是 java.lang.Enum 類的子類(java.lang.Enum 是一個抽象類)。枚舉類型符合通用模式 Class Enum<E extends Enum<E>>,而 E 表示枚舉類型的名稱。枚舉類型的每一個值都將映射到 protected Enum(String name, int ordinal) 構造函數中,在這裡,每個值的名稱都被轉換成一個字元串,並且序數設置表示了此設置被創建的順序

  上面那段代碼聲明的enum對象實際上調用了7次Enum(String name, int ordinal) 這個構造函數。(name 是常量,上面是MON,TUE等,ordinal是被創建順序)

new Enum<EnumTest>("MON",0);
new Enum<EnumTest>("TUE",1);
new Enum<EnumTest>("WED",2);
。。。。。。

 

2、switch

  當我們用switch時,一般都是使用int和char,但其實枚舉也可以用在switch中,而且可能使用枚舉,可以讓我們的代碼的可讀性更強。下麵是枚舉使用enum的例子

enum Color{  
    GREEN, YELLOW, RED  
}  
public class TrafficLight {  
    Color color = Color.RED;  
    public void change() {  
        switch (color) {  
        case RED:  
            System.out.println("紅色");  
            break;  
        case YELLOW:  
            System.out.println("黃色");  
            break;  
        case GREEN:  
            System.out.println("綠色");  
            break;  
        }  
    }  
}  

3、向枚舉中添加新方法 + 遍歷

  我們使用常量的時候,我們使用介面的時候是可以有值與之對應的,如上面IWeekConstants 介面的MON的值是Mon,但枚舉好像沒能標示出這種意義。下麵我們就討論該方式的實現和枚舉類型的遍歷

  枚舉類型提供了構造函數,我們可以通過構造函數和覆寫toString方法來實現。實現代碼如下:

package com.zcr.test;

enum ActionTypeEnum{
    //通過括弧賦值,而且必須帶有一個參構造器和一個屬性跟方法,否則編譯出錯
    //賦值必須都賦值或都不賦值,不能一部分賦值一部分不賦值;如果不賦值則不能寫構造器,賦值編譯也出錯
    下載(1,"xiazai"),訪問(2,"fangwen");
    int index;
    String name;
    
    private ActionTypeEnum(int index,String name){
        this.index = index;
        this.name = name;
    }

    public int getIndex()
    {
        return index;
    }

    public void setIndex(int index)
    {
        this.index = index;
    }

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }
    
    
}

public class EnumTest
{
    public static void main(String[] args)
    {
        ActionTypeEnum[] actionTypeEnums = ActionTypeEnum.values();
        for(ActionTypeEnum actionTypeEnum : actionTypeEnums){
            System.out.println("name=" + actionTypeEnum.getName());
            System.out.println("index= " + actionTypeEnum.getIndex());
            System.out.println("oridary=" + actionTypeEnum.ordinal());
            System.out.println("this = " + actionTypeEnum);
            System.out.println("下載值:"  + actionTypeEnum.valueOf("下載"));
            System.out.println("name()方法= " + actionTypeEnum.name());
            System.out.println("--------------叫我分割線------------------");
        }
    }
}

運行結果:

name=xiazai
index= 1
oridary=0
this = 下載
下載值:下載
name()方法= 下載
--------------叫我分割線------------------
name=fangwen
index= 2
oridary=1
this = 訪問
下載值:下載
name()方法= 訪問
--------------叫我分割線------------------

4、總結

   可以把 enum 看成是一個普通的 class,它們都可以定義一些屬性和方法,不同之處是:enum 不能使用 extends 關鍵字繼承其他類,因為 enum 已經繼承了 java.lang.Enum(java是單一繼承),但可以繼承介面。

  致謝:感謝您的閱讀!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 轉自:https://blog.shonenada.com/post/websocket-with-flask/WebSocket with FlaskHTML5 以前,HTML 還不支持WebSocket,當時如果要進行實時的內容更新,要麼使用Ajax輪詢(Polling)或者使用Comet技術。...
  • 因為總用vector,卻忘記了有stack,今天用到棧頂的值才想起來,說起來stack很方便,也很容易用,看下邊例子: 1 #include 2 #include 3 using namesapce std; 4 5 int main(void) 6 { 7 stack v; 8 ...
  • Allocators與Criterion在記憶體使用及Create、Copy、Assignment的相同點及區別
  • 感謝此文:http://blog.csdn.net/soszou/article/details/23673133 本文很多技術及操作來源於此文 需求:因為微信方面的開發調試。為了測試方便,直接構建了一個跟真實生產環境一樣的測試環境。除了功能變數名稱不同其他都一樣。想直接使用功能變數名稱進行訪問調試。用的IIS+T...
  • 今天在上班路上看到一篇互聯網網路協議的文章感覺寫的的是相當好,圖文兼備,通俗易懂,好東西嘛當然要留下了,也在這給大家分享分享!
  • 最近在使用python做介面測試,發現python中http請求方法有很多種,現彙總如下:一、python自帶庫----urllib2python自帶庫urllib2使用的比較多,簡單使用如下:import urllib2response = urllib2.urlopen('http://loca...
  • Demo:import java.nio.file.Path;import java.nio.file.Paths;public class PathInfoTest { public static void main(String[] args) { /...
  • 支付寶介面使用文檔說明 支付寶非同步通知(notify_url)與return_url.現支付寶的通知有兩類。A伺服器通知,對應的參數為notify_url,支付寶通知使用POST方式B頁面跳轉通知,對應的參數為return_url,支付寶通知使用GET方式 (通知地址不需要像以前一樣去賬戶內設置,而...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...