在實際編程中,往往存在著這樣的“數(shù)據(jù)集”,它們的數(shù)值在程序中是穩(wěn)定的,而且“數(shù)據(jù)集”中的元素是有限的。在JDK1.5之前,人們用接口來描述這一種數(shù)據(jù)類型。

1.5以后引入枚舉

一:枚舉類基本語法

定義:

  創(chuàng)建枚舉類型要使用 enum 關(guān)鍵字,如果是想聲明簡單枚舉,屬性之間用逗號相隔 ;如果是屬性帶id,類似(male(1))這種還需要一個帶id的構(gòu)造方法

簡單枚舉類:

public enum ColorEnum {
        red, green, yellow, blue;
 }

 

枚舉像普通的類一樣可以添加屬性和方法,如下

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團訓(xùn)

public enum Gender {
    MALE(0), // 男
    FEMALE(1); // 女
    int id;
    Gender(int id) {        this.id = id;
    }    public int getId() {        return id;
    }
}

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團訓(xùn)

如果不加構(gòu)造器,直接在 “類型后邊加(1)”  這種形式會報錯,如下:

enum ColorEnum {
    red(1), green(2), yellow(3), blue(4);//編譯出錯:The constructor ColorEnum(int) is undefined
}

因為枚舉類的本質(zhì)是一個Enum類,所以它可以加一些自定義的方法:比如·上邊的getId()

使用:

可以用來foreach,switch傳入枚舉變量, case 是枚舉內(nèi)定義的每一個類型。

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團訓(xùn)

Gender gender = Gender.womenswitch (gender) {     case male:
         System.out.println("male");          break;     case female:
         System.out.println("female");          break;

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團訓(xùn)

int compareTo(E o) 
          比較此枚舉與指定對象的順序。

Class<E> getDeclaringClass() 
          返回與此枚舉常量的枚舉類型相對應(yīng)的 Class 對象。

String name() 
          返回此枚舉常量的名稱,在其枚舉聲明中對其進行聲明。

int ordinal() 
          返回枚舉常量的序數(shù)(它在枚舉聲明中的位置,其中初始常量序數(shù)為零)。

String toString()

           返回枚舉常量的名稱,它包含在聲明中。

static <T extends Enum<T>> T valueOf(Class<T> enumType, String name) 
          返回帶指定名稱的指定枚舉類型的枚舉常量。

 

二:web項目中應(yīng)用枚舉

@Enumeratedprivate Gender gender;//entity類

我們看一下Gender的配置

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團訓(xùn)

ublic enum Gender {
    MALE(0), // 男
    FEMALE(1); // 女

    int id;

    Gender(int id) {        this.id = id;
    }    public int getId() {        return id;
    }
}

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團訓(xùn)

,如果調(diào)用的原聲的dao,查詢出來的結(jié)果是Map

userVO.setGender(Gender.valueOf((String) map.get("gender")));//如果查詢出來的是Map,則通過 Gender.valueOf(方法得到想要的枚舉

如果是hibernate,則會不需要我們?nèi)リP(guān)系到底查詢出來的是什么,只需要指導(dǎo)是枚舉類型即可

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團訓(xùn)

List<UserVO> userVOList = new ArrayList<UserVO>();try {
    String queryString = "select *  from User U left join U.institutions INS where INS.institution.id = '"
                    + id + "' order by U.code";
    userList = userDao.query(queryString);//如果是調(diào)用hibernate,查詢出來不需要調(diào)用valueOf()方法    if (userList != null && userList.size() > 0) {
                
    }
 }

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團訓(xùn)

 

三 :原理分析

   參照了java enum(枚舉)使用詳解 + 總結(jié),非常感謝

   enum 的語法結(jié)構(gòu)盡管和 class 的語法不一樣,但是經(jīng)過編譯器編譯之后產(chǎn)生的是一個class文件。該class文件經(jīng)過反編譯實際上是生成了一個類,該類繼承了java.lang.Enum<E>。所以, enum本質(zhì)上 java 編譯器幫我們做了語法的解析和編譯的一個普通的類。

   唯一的區(qū)別,是枚舉隱式繼承了Enum,所以不可以在繼承 ..

 EnumTest test = EnumTest.TUE;
...
System.out.println("getDeclaringClass(): " +     test.getDeclaringClass().getName());//輸出結(jié)果是getDeclaringClass(): com.dtsz.enumTest.EnumTest

 

四:EnumSet,EnumMap 的應(yīng)用

   EnumSet和EnumMap是枚舉的比較重要的用處。他們是操作枚舉對象的工具類。具體的細(xì)節(jié)推薦去看一下Java 枚舉用法詳解,在這里,我簡單的總結(jié)一下:

  EnumSet 是枚舉類型的高性能Set實現(xiàn)。它要求放入它的枚舉常量必須屬于同一枚舉類型。
  EnumMap 是專門為枚舉類型量身定做的Map實現(xiàn)。雖然使用其它的Map實現(xiàn)(如HashMap)也能完成枚舉類型實例到值得映射,但是使用EnumMap會更加高效:它只能接收同一枚舉類型的實例作為鍵值,并且由于枚舉類型實例的數(shù)量相對固定并且有限,所以EnumMap使用數(shù)組來存放與枚舉類型對應(yīng)的值。這使得EnumMap的效率非常高

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團訓(xùn)

/ EnumSet的使用
System.out.println("EnumSet展示");
EnumSet<ErrorCodeEn> errSet = EnumSet.allOf(ErrorCodeEn.class);for (ErrorCodeEn e : errSet) {
    System.out.println(e.name() + " : " + e.ordinal());
}// EnumMap的使用System.out.println("EnumMap展示");
EnumMap<StateMachine.Signal, String> errMap = new EnumMap(StateMachine.Signal.class);
errMap.put(StateMachine.Signal.RED, "紅燈");
errMap.put(StateMachine.Signal.YELLOW, "黃燈");
errMap.put(StateMachine.Signal.GREEN, "綠燈");for (Iterator<Map.Entry<StateMachine.Signal, String>> iter = errMap.entrySet().iterator(); iter.hasNext();) {
    Map.Entry<StateMachine.Signal, String> entry = iter.next();
    System.out.println(entry.getKey().name() + " : " + entry.getValue());
}

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團訓(xùn)

 

作者:leader_Hoo 
出處:http://www.cnblogs.com/ldh-better/ 
本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,唯一要求的就是請注明轉(zhuǎn)載,此外,如果博客有幫助,希望可以幫忙點擊推薦和分享,謝謝

http://www.cnblogs.com/ldh-better/p/7194044.html