1. 程式人生 > >Java 列舉enum 使用詳解

Java 列舉enum 使用詳解

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

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

在java中如何更好的使用這些“資料集”呢?因此列舉便派上了用場,以下程式碼詳細介紹了列舉的用法。

/**
 * 列舉用法詳解
 * 
 */
public class TestEnum {
    /**
     * 普通列舉
     *
     */
    public enum ColorEnum {
        red, green, yellow, blue;
    }
    
    /**
     * 列舉像普通的類一樣可以新增屬性和方法,可以為它新增靜態和非靜態的屬性或方法
     *
     */
    public enum SeasonEnum {
        //注:列舉寫在最前面,否則編譯出錯
        spring, summer, autumn, winter;

        private final static String position = "test";

        public static SeasonEnum getSeason() {
            if ("test".equals(position))
                return spring;
            else
                return winter;
        }
    }
    
    /**
     * 性別
     * 
     * 實現帶有構造器的列舉
     *
     */
    public enum Gender{
        //通過括號賦值,而且必須帶有一個參構造器和一個屬性跟方法,否則編譯出錯
        //賦值必須都賦值或都不賦值,不能一部分賦值一部分不賦值;如果不賦值則不能寫構造器,賦值編譯也出錯
        MAN("MAN"), WOMEN("WOMEN");
        
        private final String value;

        //構造器預設也只能是private, 從而保證建構函式只能在內部使用
        Gender(String value) {
            this.value = value;
        }
        
        public String getValue() {
            return value;
        }
    }
    
   /**
    * 訂單狀態
    * 
    * 實現帶有抽象方法的列舉
    * 
    */
    public enum OrderState {
        /** 已取消 */
        CANCEL {public String getName(){return "已取消";}},
        /** 待稽核 */
        WAITCONFIRM {public String getName(){return "待稽核";}},
        /** 等待付款 */
        WAITPAYMENT {public String getName(){return "等待付款";}},
        /** 正在配貨 */
        ADMEASUREPRODUCT {public String getName(){return "正在配貨";}},
        /** 等待發貨 */
        WAITDELIVER {public String getName(){return "等待發貨";}},
        /** 已發貨 */
        DELIVERED {public String getName(){return "已發貨";}},
        /** 已收貨 */
        RECEIVED {public String getName(){return "已收貨";}};
        
        public abstract String getName();
    }
    
    public static void main(String[] args) {
        //列舉是一種型別,用於定義變數,以限制變數的賦值;賦值時通過“列舉名.值”取得列舉中的值
        ColorEnum colorEnum = ColorEnum.blue;
        switch (colorEnum) {
        case red:
            System.out.println("color is red");
            break;
        case green:
            System.out.println("color is green");
            break;
        case yellow:
            System.out.println("color is yellow");
            break;
        case blue:
            System.out.println("color is blue");
            break;
        }
        
        //遍歷列舉
        System.out.println("遍歷ColorEnum列舉中的值");
        for(ColorEnum color : ColorEnum.values()){
            System.out.println(color);
        }
        
        //獲取列舉的個數
        System.out.println("ColorEnum列舉中的值有"+ColorEnum.values().length+"個");
        
        //獲取列舉的索引位置,預設從0開始
        System.out.println(ColorEnum.red.ordinal());//0
        System.out.println(ColorEnum.green.ordinal());//1
        System.out.println(ColorEnum.yellow.ordinal());//2
        System.out.println(ColorEnum.blue.ordinal());//3
        
        //列舉預設實現了java.lang.Comparable介面
        System.out.println(ColorEnum.red.compareTo(ColorEnum.green));//-1
        
        System.out.println("===========");
        System.err.println("季節為" + SeasonEnum.getSeason());
        
        System.out.println("===========");
        for(Gender gender : Gender.values()){
            System.out.println(gender.value);
        }
       
        System.out.println("===========");
        for(OrderState order : OrderState.values()){
            System.out.println(order.getName());
        }
    }
    
}

enum 的語法結構儘管和 class 的語法不一樣,但是經過編譯器編譯之後產生的是一個class檔案。該class檔案經過反編譯可以看到實際上是生成了一個類,該類繼承了java.lang.Enum<E>。所以,實際上 enum 就是一個 class,只不過 java 編譯器幫我們做了語法的解析和編譯而已。可以把 enum 看成是一個普通的 class,它們都可以定義一些屬性和方法,不同之處是:enum 不能使用 extends 關鍵字繼承其他類,因為 enum 已經繼承了 java.lang.Enum(java是單一繼承)。

相關推薦

Java 列舉(enum) 7種常見的用法

JDK1.5引入了新的型別——列舉。在 Java 中它雖然算個“小”功能,卻給我的開發帶來了“大”方便。 大師兄我又加上自己的理解,來幫助各位理解一下。 用法一:常量 在JDK1.5 之前,我們定義常量都是: public static final.... 。現在好

java列舉(enum)

       一.為什麼要使用列舉.             需求:定義一個Employee(員工),使用一個變數restday來表示他哪一天休息.如圖:                                                       

Java 列舉(enum) 7種常見的用法(轉)

原文:https://blog.csdn.net/qq_27093465/article/details/52180865JDK1.5引入了新的型別——列舉。在 Java 中它雖然算個“小”功能,卻給我的開發帶來了“大”方便。大師兄我又加上自己的理解,來幫助各位理解一下。用法

Java 列舉 enum

> 本文部分摘自 On Java 8 ## 列舉型別 Java5 中添加了一個 enum 關鍵字,通過 enum 關鍵字,我們可以將一組擁有具名的值的有限集合建立為一種新的型別,這些具名的值可以作為常規的程式元件使用,例如: ```java public enum Spiciness {

C++中列舉enum

轉載部落格地址:https://blog.csdn.net/bruce_0712/article/details/54984371     眾所周知,C/C++語言可以使用#define和const建立符號常量,而使用enum工具不僅能夠建立符號常量,還能定義新

Java列舉型別(原理+用法)

可以這麼說,Java的列舉型別本來是不存在的,但Java發了個"語法糖",就有了列舉型別。Java從JDK1.5開始支援列舉,通常一個特性如果在一開始沒有提供,在語言發展後期才新增,會遇到一個問題,就是向後相容性的問題。像Java在1.5中引入的很多特性,為了向後相容,編譯

Java 列舉(enum)型別 常見7種用法

JDK1.5引入了新的型別——列舉。在 Java 中它雖然算個“小”功能,卻給我的開發帶來了“大”方便。 用法一:常量 在JDK1.5 之前,我們定義常量都是: public static final.... 。現在好了,有了列舉,可以把相關

java enum(列舉)使用

說來慚愧,一直沒有怎麼使用過列舉,只知道可以定義日期中的星期幾,沒有用到也就沒有學習,現在還是覺得應該認真瞭解下,在可以用到的時候也會發現原來列舉也可以解決這個問題。廢話不多說了,詳細在下面: 原始的介面定義常量 public 

java enum(列舉)使用 + 總結

enum 的全稱為 enumeration, 是 JDK 1.5 中引入的新特性,存放在 java.lang 包中。下面是我在使用 enum 過程中的一些經驗和總結。原始的介面定義常量public interface IConstants { Stri

Java 列舉enum 使用

在實際程式設計中,往往存在著這樣的“資料集”,它們的數值在程式中是穩定的,而且“資料集”中的元素是有限的。 例如星期一到星期日七個資料元素組成了一週的“資料集”,春夏秋冬四個資料元素組成了四季的“資料集”。 在java中如何更好的使用這些“資料集”呢?因此列舉便派上了用場,

Javaenum(列舉)使用 + 總結

enum 的全稱為 enumeration, 是 JDK 1.5  中引入的新特性,存放在 java.lang 包中。     下面是我在使用 enum 過程中的一些經驗和總結,主要包括如下內容: 8. 總結

java enum(列舉)使用和總結(轉)

enum 的全稱為 enumeration, 是 JDK 1.5  中引入的新特性,存放在 java.lang 包中。     下面是我在使用 enum 過程中的一些經驗和總結,主要包括如下內容: 1. 原始的介面定義常量 2. 語法(定義) 3. 遍歷、switch 等常用

【C/C++開發】C++之enum列舉量宣告、定義、使用與列舉列舉類前置型別宣告

前面講到可以通過強制轉換將其他型別值賦給列舉變數:Weekday = enumType(2);這是合法的;但是Weekday = enumType(20);是非法的。這裡涉及列舉取值範圍的概念:列舉的上限是 大於最大列舉量的 最小的2的冪,減去1; 列舉的下限有兩種情況:一、列舉量的最小值不小於0,則列

C++之enum列舉量宣告、定義、使用與列舉

前面講到可以通過強制轉換將其他型別值賦給列舉變數:Weekday = enumType(2);這是合法的;但是Weekday = enumType(20);是非法的。這裡涉及列舉取值範圍的概念:列舉的上限是 大於最大列舉量的 最小的2的冪,減去1; 列舉的下限有兩種情況:一、列舉量的最小值不小於0,則列

java.util包(二)——Connection接口

操作 相同 元素 叠代 cat roo soft true nbsp Connection接口介紹   Connection接口是java集合的root接口,沒有實現類,只有子接口和實現子接口的各種容器。主要用來表示java集合這一大的抽象概念。   Connection接

java對象

add splay view created 元素 繼承關系 外部 優化 csdn java對象詳解 內存布局 普通對象布局 數組的內存布局 內部類的內存布局 對象分解 對象頭-mark word(8字節) 實例數據 對齊填充(可選) java鎖分析

Java泛型

對象數組 整形 泛型方法 tty 接受 一個 div -m color 泛型的本質是參數化類型,也就是說所操作的數據類型被指定為一個參數。 假定我們有這樣一個需求:寫一個排序方法,能夠對整形數組、字符串數組甚至其他任何類型的數組進行排序,該如何實現? 答案是可以使用 Ja

Java常量池

回收 array 數值 編譯期 二進制格式 new 保持 占用 get 轉自:http://www.cnblogs.com/iyangyuan/p/4631696.html jvm虛擬內存分布圖: 程序計數器:JVM執行程序的流水線。 本地方法棧:JVM調用操作系統方法所

Java線程(一)

線程 thread runnable 程序、進程、線程的概念 程序(program):是為完成特定任務、用某種語言編寫的一組指令的集合。即指一段靜態的代碼,靜態對象。 進程(process):是程序的一次執行過程,或是正在運行的一個程序。動態過程:有它自身的產生、存在和消亡的過程。 如

Java反射機制

java 反射 反射機制 工廠模式 1反射機制是什麽反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱為java語言的反射機制。在面向對象的世界裏,萬事萬物皆對象.在ja