亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Java enum的用法詳解

2019-11-14 10:04:39
字體:
來源:轉載
供稿:網友

用法一:常量

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

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多路分發

轉自:http://www.49028c.com/happyPawpaw/archive/2013/04/09/3009553.html


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产香蕉一区二区三区在线视频| 精品自在线视频| 福利一区福利二区微拍刺激| 国产精品福利小视频| 国产亚洲精品久久久优势| 国产一区二区美女视频| 深夜福利国产精品| 亚洲国产高清高潮精品美女| 日韩免费不卡av| 亚洲欧美综合精品久久成人| 91精品国产色综合久久不卡98| 亚洲欧洲av一区二区| 午夜精品一区二区三区视频免费看| 久久精品夜夜夜夜夜久久| 久久精品国产亚洲精品2020| 久久99视频免费| 国产综合香蕉五月婷在线| 色小说视频一区| 日本a级片电影一区二区| 久久99热这里只有精品国产| 精品一区二区三区四区在线| 成人欧美一区二区三区黑人孕妇| 成人羞羞国产免费| 欧美性生交大片免费| 日韩视频免费在线观看| 丁香五六月婷婷久久激情| 麻豆乱码国产一区二区三区| 这里只有视频精品| 久久精品视频va| 成人在线播放av| 欧美日韩国产色视频| 色老头一区二区三区在线观看| 亚洲欧洲激情在线| 免费91麻豆精品国产自产在线观看| 亚洲欧美国产日韩天堂区| 久久久精品一区| 亚洲国产欧美久久| 国产欧美一区二区三区久久人妖| 在线视频日韩精品| 亚洲一区av在线播放| 亚洲乱码国产乱码精品精| 久久在线免费视频| 亚洲精品国产电影| 成人夜晚看av| 亚洲无线码在线一区观看| 亚洲一区二区自拍| 国产精品日本精品| 一区二区国产精品视频| 欧美国产激情18| 欧美成aaa人片在线观看蜜臀| 国产精品国产三级国产aⅴ浪潮| 久久久国产视频91| 国产精品va在线| 国产精品丝袜白浆摸在线| 国产精品久久久久77777| 欧美在线视频免费播放| 国产精品久久久久久搜索| 中文字幕一精品亚洲无线一区| 亚洲精品日韩久久久| 欧美电影在线观看网站| 亚洲免费人成在线视频观看| 91国产高清在线| 91亚洲精品在线观看| 日韩小视频网址| 亚洲精品视频免费| 97在线视频免费看| 91欧美精品午夜性色福利在线| 亚洲免费人成在线视频观看| 亚洲一区www| 国产精品欧美日韩一区二区| 欧美精品成人在线| 欧美富婆性猛交| www.日本久久久久com.| 国产精品美女在线观看| 欧美日韩裸体免费视频| 国产成人精品在线播放| 亚洲第一av网站| 精品丝袜一区二区三区| 精品偷拍各种wc美女嘘嘘| 一区二区三区视频观看| 国产精品香蕉在线观看| 亚洲专区国产精品| 久久精品夜夜夜夜夜久久| 久久久综合免费视频| 国产z一区二区三区| xxx成人少妇69| 国产精品 欧美在线| 欧美日韩电影在线观看| 亚洲精品xxx| 色综合五月天导航| 成人激情免费在线| 中文字幕亚洲一区| 欧美激情videos| 性亚洲最疯狂xxxx高清| 日韩欧美在线一区| 深夜福利一区二区| 欧美—级高清免费播放| 久久午夜a级毛片| 欧美激情图片区| 欧美精品日韩www.p站| 国产视频久久网| 久久久亚洲天堂| 欧美日韩亚洲系列| 欧美激情一区二区三级高清视频| 国产精品久久久久免费a∨| 日韩三级成人av网| 91国产精品91| 亚洲最大福利视频网站| 高潮白浆女日韩av免费看| 色综合久久久888| 亚洲精品国产精品国自产在线| 日韩精品视频在线观看免费| 日韩激情av在线免费观看| 国产免费一区二区三区香蕉精| 国产成人精品免高潮费视频| 国产视频福利一区| 都市激情亚洲色图| 久久99青青精品免费观看| 97婷婷大伊香蕉精品视频| 国产精品美女在线| 在线精品播放av| 国产精品视频专区| 欧美精品成人在线| 欧美日韩亚洲网| 97成人在线视频| 久久伊人色综合| 国产精品久久久久久久久久久久久| 91国产精品91| 亚洲区bt下载| 韩国三级电影久久久久久| www.日韩视频| 欧美午夜精品久久久久久浪潮| 欧美性猛交xxxx黑人| 91在线精品播放| 色爱av美腿丝袜综合粉嫩av| 久久久最新网址| 久久综合色影院| 亚洲精品一区二三区不卡| 精品久久久久久久久国产字幕| 久久精品免费电影| 亚洲香蕉av在线一区二区三区| 日韩av在线一区二区| 久久久久久国产精品美女| 日韩在线观看免费高清| 精品无人国产偷自产在线| 日韩国产精品亚洲а∨天堂免| 欧美国产日本高清在线| 国产专区欧美专区| 亚洲欧美日韩在线一区| 国产精品揄拍500视频| 欧美极品美女视频网站在线观看免费| 欧美激情日韩图片| 成人午夜一级二级三级| 日韩精品在线观看一区| 欧美激情精品久久久久久免费印度| 97视频网站入口| 欧美中文字幕在线视频| 日韩av网站大全| 精品国产一区久久久| 国产精品久久久久久av福利软件| 亚洲人永久免费| 精品国产一区二区三区在线观看| 91在线国产电影| 正在播放欧美一区|