1. 程式人生 > >java之 ------ 枚舉類型

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

line tis 宋體 rda csdn 枚舉 解決 方法 trac

枚舉


一、枚舉類型具體說明

簡單的說。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,主要的運用應該沒什麽問題。



















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