1. 程式人生 > >高階Java列舉型別enum使用詳解

高階Java列舉型別enum使用詳解

java的Enum列舉型別終於在j2se1.5出現了。之前覺得它只不過是雞肋而已,可有可無。畢竟這麼多年來,沒有它,大家不都過得很好嗎?今 日看《Thinking in Java》4th edition,裡面有一句話“有時恰恰因為它,你才能夠"優雅而乾淨"地解決問題。優雅與清晰很重要,正式它們區別了成功的解決方案與失敗的解決方案。 而失敗的解決方案就是因為其他人無法理他。"使用Enum列舉型別,可以將以前笨拙的程式碼變得優雅簡單?但是,我同時也在思考另外一個問題,使用新的技 術,會不會給技術人員帶來更多的負擔呢?

"學習新版語言的一個危險就是瘋狂使用新的語法結構"

先學習一下enum的簡單應用,以下簡潔的程式碼已經包括enum所提供的絕大部分功能。

1.enum的應用,包括定義,遍歷,switch,enumset,enummap等

Java程式碼 
package com.janeky.enumtest;    
import java.util.EnumMap;    
import java.util.EnumSet;    
   
/**   
 * Java列舉型別enum使用詳解   
 * @version 2009/9/5   
 * @author janeky   
 * @mail [email protected]   
 *   
 */   
public class EnumTest {    
   
    //定義一個enum列舉型別,包括兩個例項ON,OFF    
    public enum State {    
        ON, OFF    
    };    
   
    //測試函式    
    public static void main(String[] args) {    
        //直接變數enum    
        for (State s : State.values())    
            System.out.println(s.name());    
   
        //switch與enum的結合使用    
        State switchState = State.OFF;    
        switch (switchState) {    
        case OFF:    
            System.out.println("OFF");    
            break;    
        case ON:    
            System.out.println("ON");    
            break;    
        }    
   
        //EnumSet的使用    
        EnumSet stateSet = EnumSet.allOf(State.class);    
        for (State s : stateSet) {    
            System.out.println(s);    
        }    
   
        //EnumMap的使用    
        EnumMap stateMap = new EnumMap(    
                State.class);    
        stateMap.put(State.ON, "is On");    
        stateMap.put(State.OFF, "is off");    
        for (State s : State.values()) {    
            System.out.println(s.name() + ":" + stateMap.get(s));    
        }    
    }    
   
}   
package com.janeky.enumtest;
import java.util.EnumMap;
import java.util.EnumSet;

/**
 * Java列舉型別enum使用詳解
 * @version 2009/9/5
 * @author janeky
 * @mail [email protected]
 *
 */
public class EnumTest {

 //定義一個enum列舉型別,包括兩個例項ON,OFF
 public enum State {
  ON, OFF
 };

 //測試函式
 public static void main(String[] args) {
  //直接變數enum
  for (State s : State.values())
   System.out.println(s.name());

  //switch與enum的結合使用
  State switchState = State.OFF;
  switch (switchState) {
  case OFF:
   System.out.println("OFF");
   break;
  case ON:
   System.out.println("ON");
   break;
  }

  //EnumSet的使用
  EnumSet stateSet = EnumSet.allOf(State.class);
  for (State s : stateSet) {
   System.out.println(s);
  }

  //EnumMap的使用
  EnumMap stateMap = new EnumMap(
    State.class);
  stateMap.put(State.ON, "is On");
  stateMap.put(State.OFF, "is off");
  for (State s : State.values()) {
   System.out.println(s.name() + ":" + stateMap.get(s));
  }
 }

}


為每個enum例項定義不同的方法

Java程式碼 
package com.janeky.enumtest;    
   
public enum TestEnumMathod {    
    //為每個enum例項新增不同的實現方法    
    SAMPLE1 {    
        String getInfo() {    
            return "SAMPLE1";    
        }    
    },    
    SAMPLE2{    
        String getInfo()    
        {    
            return "SAMPLE2";    
        }    
    };    
    abstract String getInfo();    
        
    //測試    
    public static void main(String args[])    
    {    
        for(TestEnumMathod method:values())    
        {    
            System.out.println(method.getInfo());    
        }    
    }    
        
}   
package com.janeky.enumtest;

public enum TestEnumMathod {
 //為每個enum例項新增不同的實現方法
 SAMPLE1 {
  String getInfo() {
   return "SAMPLE1";
  }
 },
 SAMPLE2{
  String getInfo()
  {
   return "SAMPLE2";
  }
 };
 abstract String getInfo();
 
 //測試
 public static void main(String args[])
 {
  for(TestEnumMathod method:values())
  {
   System.out.println(method.getInfo());
  }
 }
 
}
以下內容可能有些無聊,但絕對值得一窺
1.
public class State {
  public static final int ON = 1;
  public static final Int OFF= 0;
}

有什麼不好了,大家都這樣用了很長時間了,沒什麼問題啊。
首先,它不是型別安全的。你必須確保是int
其次,你還要確保它的範圍是0和1
最後,很多時候你打印出來的時候,你只看到 1 和0 ,

但其沒有看到程式碼的人並不知道你的企圖
so,拋棄你所有舊的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多路分發

相關推薦

高階Java列舉型別enum使用

java的Enum列舉型別終於在j2se1.5出現了。之前覺得它只不過是雞肋而已,可有可無。畢竟這麼多年來,沒有它,大家不都過得很好嗎?今 日看《Thinking in Java》4th edition,裡面有一句話“有時恰恰因為它,你才能夠"優雅而乾淨"地解決問題。優雅

【小家Java】深入理解Java列舉型別(enum)及7種常見的用法(含EnumMap和EnumSet)

相關閱讀 【小家java】java5新特性(簡述十大新特性) 重要一躍 【小家java】java6新特性(簡述十大新特性) 雞肋升級 【小家java】java7新特性(簡述八大新特性) 不溫不火 【小家java】java8新特性(簡述十大新特性) 飽受讚譽 【小家java】java9

Java變數型別使用

在Java語言中,所有的變數在使用前必須宣告。宣告變數的基本格式如下:type identifier [ = value][, identifier [= value] …] ; 格式說明: type為Java資料型別。 identifier是變數名。可以使用逗號隔開來宣告多個同類型變數。

java列舉型別(enum)

列舉實現原理 package com.own.learn.jdk.enum1; public enum Day { MONDAY("monday"), TUESDAY("TUESDAY"), WEDNESDAY("WEDNESDAY"),

Java列舉型別(enum)-5

EnumMap EnumMap基本用法 先思考這樣一個問題,現在我們有一堆size大小相同而顏色不同的資料,需要統計出每種顏色的數量是多少以便將資料錄入倉庫,定義如下列舉用於表示顏色Color: enum Color { GREEN,RED,BLUE,YELLO

Java列舉型別(enum)-7

EnumSet原理 有前面位向量的分析,對於瞭解EnumSet的實現原理就相對簡單些了,EnumSet內部使用的位向量實現的,前面我們說過EnumSet是一個抽象類,事實上它存在兩個子類,RegularEnumSet和JumboEnumSet。RegularEnumSet使

java列舉型別enum

只能夠取特定值的一個,使用enum關鍵字, 在編譯期間就確定某一些值必須取特定的一些值的之一 public class Enum { public enum Day {yesterday,today,tomorrow};//定義新型別,只能取大括號內三者之一 publ

深入理解Java列舉型別(enum)

關聯文章: 本篇主要是深入對Java中列舉型別進行分析,主要內容如下: 理解列舉型別 列舉型別是Java 5中新增特性的一部分,它是一種特殊的資料型別,之所以特殊是因為它既是一種類(class)型別卻又比類型別多了些特殊的

java列舉型別enum的使用

java 列舉型別enum 的使用 最近跟同事討論問題的時候,突然同事提到我們為什麼java 中定義的常量值不採用enmu 列舉型別,而採用public final static 型別來定義呢?

java列舉型別enum值與整數的轉換

java程式設計中偶爾會用到列舉,為了直觀,我們通常將列舉值設定為形象的單詞,方便理解和使用。列舉型別相當於資料庫中字典表,但是列舉只有字典表的值,缺少其他用來表示和值一一對應的欄位,當我們在資料庫中儲存一個對應列舉型別的列,我們希望儲存的是類似0,1,2,3,4這樣的數字,

java列舉型別enum和註解

做java專案時候發現常量好像怎麼不是固值,問度娘才知道,計算機語言中有個資料型別叫列舉enum,用來限制資料範圍比如1年=365天=365*24h=.........所以還是固值,表示式方式變了而已,如下常量毫秒轉換其他單位方法:然後就是註解(之前用的都是xml配置bean

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

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

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

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

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列舉型別 Enum

列舉例子如下: public enum Status { SCUUESS("1", "成功"), FAILED("2", "失敗"); private String value;

java列舉型別Enum的用法

以前對Enum只有一個模糊的概念,最近專案中要用,所以就專門研究了一下: java的Enum列舉型別終於在j2se1.5出現了。之前覺得它只不過是雞肋而已,可有可無。畢竟這麼多年來,沒有它,大家不都過得很好嗎?今日看《Thinking in Java》4th edition

java jdk1.5 特性 -- 列舉型別 Enum的使用與分析

public enum Color{       RED,BLUE,BLACK,YELLOW,GREEN   }   顯然,enum很像特殊的class,實際上enum宣告定義的型別就是一個類。 而這些類都是類庫中Enum類的子類(java.lang.Enum<E>)。它們繼承了這個Enu