天天看點

java之 ------ 枚舉類型

枚舉

一、枚舉類型具體說明

簡單的說。Enum一般用來表示一組同樣類型的常量。

如性别、日期、月份、顔色等。對這些屬性用常量的優點是顯而易見的,不僅能夠保證單例,且在比較的時候能夠用”==”來替

換equals。JDK1.5之前沒有Enum這個類型,那時候一般用接口常量來替代。

定義枚舉類型時本質上就是在定義一個類别。僅僅隻是非常多細節由編譯器幫您完畢了。是以某些程度上,enum是一個keyword,它的作用就像是class或interface。(這就是為什麼有些人找不到當中的value()方法)

二、枚舉類型的用法

1)常量

在Enum出現之前,我們定義常量通常是:public static fianl....      這種常量比較單一。而有了枚舉就好的多,它能夠看成是對象常量,并且還有相似集合的功能,同一時候定義多個對象常量。

如:

<span style="font-size:14px;">enum Signal { 
   GREEN, YELLOW, RED;
} </span>      

用的時候:Signal s = Signal.RED;即可了

注:用這個方案使用枚舉類型,RED後面的分号能夠不用寫

2)switch

<span style="font-size:14px;">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;
         }
   }
} </span>      

3)向枚舉中加入新方法

<span style="font-size:14px;">public enum Color {
   RED("紅色", 1), GREEN("綠色", 2), BLANK("白色", 3), YELLOW("黃色", 4) ;
   // 成員變量
   private final String name;
   private final int index;
   // 構造方法,必須私有
   private Color(String name, int index) {
       this.name = name; 
       this.index = index;
   }   
   public String getName() { return name; }
   public int getIndex() { return index; }
} 
</span>      

由于是常量,是以不能讓其它人能夠new這個對象。也就是将這個類封裝起來。不讓不論什麼人能夠new。方法是通過将構造方法私有化即可。private Color(String name, int index)

注:假設打算自己定義自己的方法。那麼必須在enum執行個體序列的最後加入一個分号。

也就是這裡的YELLOW("黃色",4)後面必須有“ ; ”。

三、枚舉的靜态方法

枚舉的靜态方法有兩個

1)values()擷取枚舉類型的全部枚舉常量傳回值為​

​static ElementType[]​

for(UserTypeEnum userType: UserTypeEnum.values()){
<span style="white-space:pre">  </span>if(userType.getName().equalsIgnoreCase(name)){
    return userType.getType();
  }
}      

2)valueOf(Class<T> enumType, String name) 傳回帶指定名稱的指定枚舉類型的枚舉常量。傳回值為​

​static ElementType​

注:然後就發現一個問題,value方法我怎麼找不到,查查才發現。 values()方法是編譯器插入到enum定義中的static方法。是以,當你将enum執行個體向上轉型為父類Enum類,

values()就不可訪問了。

解決的方法:在java.lang包下一個java.lang.annotation包(凝視的意思),裡面有一個ELementType類,當中就有想要找的這兩個靜态方法。

是以不能說

枚舉類型實質上繼承java.lang.Enum類。

四、EnumSet類和EnumMap類

這兩個類在java.util包中。看看api,主要的運用應該沒什麼問題。