Java enum的用法詳解

來源:互聯網
上載者:User

標籤:interface   this   方法區   private   組織   執行個體   string   muse   hang   

用法一:常量

在JDK1.5 之前,我們定義常量都是: public static fianl.... 。現在好了,有了枚舉,可以把相關的常量分組到一個枚舉類型裡,而且枚舉提供了比常量更多的方法。

public enum Color {    RED, GREEN, BLANK, YELLOW  } 

用法二:switch

JDK1.6之前的switch語句只支援int,char,enum類型,使用枚舉,能讓我們的代碼可讀性更強。

enum Signal {        GREEN, YELLOW, RED    }    public class TrafficLight {        Signal color = Signal.RED;        public void change() {            switch (color) {            case RED:                color = Signal.GREEN;                break;            case YELLOW:                color = Signal.RED;                break;            case GREEN:                color = Signal.YELLOW;                break;            }        }    }

用法三:向枚舉中添加新方法

如果打算自訂自己的方法,那麼必須在enum執行個體序列的最後添加一個分號。而且 Java 要求必須先定義 enum 執行個體。

public enum Color {        RED("紅色", 1), GREEN("綠色", 2), BLANK("白色", 3), YELLO("黃色", 4);        // 成員變數        private String name;        private int index;        // 構造方法        private Color(String name, int index) {            this.name = name;            this.index = index;        }        // 普通方法        public static String getName(int index) {            for (Color c : Color.values()) {                if (c.getIndex() == index) {                    return c.name;                }            }            return null;        }        // get set 方法        public String getName() {            return name;        }        public void setName(String name) {            this.name = name;        }        public int getIndex() {            return index;        }        public void setIndex(int index) {            this.index = index;        }    }

用法四:覆蓋枚舉的方法

下面給出一個toString()方法覆蓋的例子。

public class Test {    public enum Color {        RED("紅色", 1), GREEN("綠色", 2), BLANK("白色", 3), YELLO("黃色", 4);        // 成員變數        private String name;        private int index;        // 構造方法        private Color(String name, int index) {            this.name = name;            this.index = index;        }        // 覆蓋方法        @Override        public String toString() {            return this.index + "_" + this.name;        }    }    public static void main(String[] args) {        System.out.println(Color.RED.toString());    }}

用法五:實現介面

所有的枚舉都繼承自java.lang.Enum類。由於Java 不支援多繼承,所以枚舉對象不能再繼承其他類。

public interface Behaviour {        void print();        String getInfo();    }    public enum Color implements Behaviour {        RED("紅色", 1), GREEN("綠色", 2), BLANK("白色", 3), YELLO("黃色", 4);        // 成員變數        private String name;        private int index;        // 構造方法        private Color(String name, int index) {            this.name = name;            this.index = index;        }        // 介面方法        @Override        public String getInfo() {            return this.name;        }        // 介面方法        @Override        public void print() {            System.out.println(this.index + ":" + this.name);        }    }

用法六:使用介面組織枚舉

public interface Food {        enum Coffee implements Food {            BLACK_COFFEE, DECAF_COFFEE, LATTE, CAPPUCCINO        }        enum Dessert implements Food {            FRUIT, CAKE, GELATO        }    }

用法七:關於枚舉集合的使用

java.util.EnumSet和java.util.EnumMap是兩個枚舉集合。EnumSet保證集合中的元素不重複;EnumMap中的 key是enum類型,而value則可以是任意類型。關於這個兩個集合的使用就不在這裡贅述,可以參考JDK文檔

枚舉和常量定義的區別

一、 通常定義常量方法

我們通常利用public final static方法定義的代碼如下,分別用1表示紅燈,3表示綠燈,2表示黃燈。

public class Light {        /* 紅燈 */        public final static int RED = 1;        /* 綠燈 */        public final static int GREEN = 3;        /* 黃燈 */        public final static int YELLOW = 2;    }

二、 枚舉類型定義常量方法

枚舉類型的簡單定義方法如下,我們似乎沒辦法定義每個枚舉類型的值。比如我們定義紅燈、綠燈和黃燈的代碼可能如下:

public enum Light {        RED, GREEN, YELLOW;    }

我們只能夠表示出紅燈、綠燈和黃燈,但是具體的值我們沒辦法表示出來。別急,既然枚舉類型提供了建構函式,我們可以通過建構函式和覆寫toString方法來實現。首先給Light枚舉類型增加構造方法,然後每個枚舉類型的值通過建構函式傳入對應的參數,同時覆寫toString方法,在該方法中返回從建構函式中傳入的參數,改造後的代碼如下:

public enum Light {    // 利用建構函式傳參    RED(1), GREEN(3), YELLOW(2);    // 定義私人變數    private int nCode;    // 建構函式,枚舉類型只能為私人    private Light(int _nCode) {        this.nCode = _nCode;    }    @Override    public String toString() {        return String.valueOf(this.nCode);    }}

三、 完整範例程式碼

枚舉類型的完整示範代碼如下:

public class LightTest {    // 1.定義枚舉類型    public enum Light {        // 利用建構函式傳參        RED(1), GREEN(3), YELLOW(2);        // 定義私人變數        private int nCode;        // 建構函式,枚舉類型只能為私人        private Light(int _nCode) {            this.nCode = _nCode;        }        @Override        public String toString() {            return String.valueOf(this.nCode);        }    }    /**     *      * @param args     */    public static void main(String[] args) {        // 1.遍曆枚舉類型        System.out.println("示範枚舉類型的遍曆 ......");        testTraversalEnum();        // 2.示範EnumMap對象的使用        System.out.println("示範EnmuMap對象的使用和遍曆.....");        testEnumMap();        // 3.示範EnmuSet的使用        System.out.println("示範EnmuSet對象的使用和遍曆.....");        testEnumSet();    }    /**     *      * 示範枚舉類型的遍曆     */    private static void testTraversalEnum() {        Light[] allLight = Light.values();        for (Light aLight : allLight) {            System.out.println("當前燈name:" + aLight.name());            System.out.println("當前燈ordinal:" + aLight.ordinal());            System.out.println("當前燈:" + aLight);        }    }    /**     *      * 示範EnumMap的使用,EnumMap跟HashMap的使用差不多,只不過key要是枚舉類型     */    private static void testEnumMap() {        // 1.示範定義EnumMap對象,EnumMap對象的建構函式需要參數傳入,預設是key的類的類型        EnumMap<Light, String> currEnumMap = new EnumMap<Light, String>(        Light.class);        currEnumMap.put(Light.RED, "紅燈");        currEnumMap.put(Light.GREEN, "綠燈");        currEnumMap.put(Light.YELLOW, "黃燈");        // 2.遍曆對象        for (Light aLight : Light.values()) {            System.out.println("[key=" + aLight.name() + ",value="            + currEnumMap.get(aLight) + "]");        }    }    /**     *      * 示範EnumSet如何使用,EnumSet是一個抽象類別,擷取一個類型的枚舉類型內容<BR/>     *      * 可以使用allOf方法     */    private static void testEnumSet() {        EnumSet<Light> currEnumSet = EnumSet.allOf(Light.class);        for (Light aLightSetElement : currEnumSet) {            System.out.println("當前EnumSet中資料為:" + aLightSetElement);        }    }}

  

執行結果如下:

示範枚舉類型的遍曆 ......

當前燈name:RED

當前燈ordinal:0

當前燈:1

當前燈name:GREEN

當前燈ordinal:1

當前燈:3

當前燈name:YELLOW

當前燈ordinal:2

當前燈:2

示範EnmuMap對象的使用和遍曆.....

[key=RED,value=紅燈]

[key=GREEN,value=綠燈]

[key=YELLOW,value=黃燈]

示範EnmuSet對象的使用和遍曆.....

當前EnumSet中資料為:1

當前EnumSet中資料為:3

當前EnumSet中資料為:2

四、 通常定義常量方法和枚舉定義常量方法區別

以下內容可能有些無聊,但絕對值得一窺

1. 代碼:

public class State {public static final int ON = 1;public static final Int OFF= 0;}

  

有什麼不好了,大家都這樣用了很長時間了,沒什麼問題啊。

首先,它不是型別安全的。你必須確保是int

其次,你還要確保它的範圍是0和1

最後,很多時候你列印出來的時候,你只看到 1 和0 ,

但其沒有看到代碼的人並不知道你的企圖,拋棄你所有舊的public static final常量 

2. 可以建立一個enum類,把它看做一個普通的類。除了它不能繼承其他類了。(java是單繼承,它已經繼承了Enum),

可以添加其他方法,覆蓋它本身的方法

3. switch()參數可以使用enum了

4. values()方法是編譯器插入到enum定義中的static方法,所以,當你將enum執行個體向上轉型為父類Enum是,values()就不可訪問了。解決辦法:在Class中有一個getEnumConstants()方法,所以即便Enum介面中沒有values()方法,我們仍然可以通過Class對象取得所有的enum執行個體

5. 無法從enum繼承子類,如果需要擴充enum中的元素,在一個介面的內部,建立實現該介面的枚舉,以此將元素進行分組。達到將枚舉元素進行分組。

6. 使用EnumSet代替標誌。enum要求其成員都是唯一的,但是enum中不能刪除添加元素。

7. EnumMap的key是enum,value是任何其他Object對象。

8. enum允許程式員為eunm執行個體編寫方法。所以可以為每個enum執行個體賦予各自不同的行為。

9. 使用enum的職責鏈(Chain of Responsibility) .這個關係到設計模式的職責鏈模式。以多種不同的方法來解決一個問題。然後將他們連結在一起。當一個請求到來時,遍曆這個鏈,直到鏈中的某個解決方案能夠處理該請求。

10. 使用enum的狀態機器

11. 使用enum多路分發

 

轉自:https://www.cnblogs.com/happyPawpaw/archive/2013/04/09/3009553.html

Java enum的用法詳解

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.