Java 數據類型在實際開發中應用二枚舉

  在實際編程中,每每存在着這樣的「數據集」,它們的數值在程序中是穩定的,並且「數據集」中的元素是有限的。在JDK1.5以前,人們用接口來描述這一種數據類型。html

1.5之後引入枚舉java

一:枚舉類基本語法

定義:

  建立枚舉類型要使用 enum 關鍵字,若是是想聲明簡單枚舉,屬性之間用逗號相隔 ;若是是屬性帶id,相似(male(1))這種還須要一個帶id的構造方法web

簡單枚舉類:編程

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

 

枚舉像普通的類同樣能夠添加屬性和方法,以下數組

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

若是不加構造器,直接在 「類型後邊加(1)」  這種形式會報錯,以下:工具

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

由於枚舉類的本質是一個Enum類,因此它能夠加一些自定義的方法:好比·上邊的getId()post

使用:

能夠用來foreach,switch傳入枚舉變量, case 是枚舉內定義的每個類型。性能

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

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

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

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

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

String toString()

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

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

 

二:web項目中應用枚舉

@Enumerated
private Gender gender;//entity類

咱們看一下Gender的配置

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

    int id;

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

,若是調用的原聲的dao,查詢出來的結果是Map

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

若是是hibernate,則會不須要咱們去關係到底查詢出來的是什麼,只須要指導是枚舉類型便可

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);//若是是調用hibernate,查詢出來不須要調用valueOf()方法
    if (userList != null && userList.size() > 0) {
                
    }
 }

 

三 :原理分析

   參照了java enum(枚舉)使用詳解 + 總結,很是感謝

   enum 的語法結構儘管和 class 的語法不同,可是通過編譯器編譯以後產生的是一個class文件。該class文件通過反編譯其實是生成了一個類,該類繼承了java.lang.Enum<E>。因此, enum本質上 java 編譯器幫咱們作了語法的解析和編譯的一個普通的類。

   惟一的區別,是枚舉隱式繼承了Enum,因此不能夠在繼承 ..

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

 

四:EnumSet,EnumMap 的應用

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

  EnumSet 是枚舉類型的高性能Set實現。它要求放入它的枚舉常量必須屬於同一枚舉類型。
  EnumMap 是專門爲枚舉類型量身定作的Map實現。雖然使用其它的Map實現(如HashMap)也能完成枚舉類型實例到值得映射,可是使用EnumMap會更加高效:它只能接收同一枚舉類型的實例做爲鍵值,而且因爲枚舉類型實例的數量相對固定而且有限,因此EnumMap使用數組來存放與枚舉類型對應的值。這使得EnumMap的效率很是高

/ 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());
}
相關文章
相關標籤/搜索