學習Java: 1.5:Enum

zybing發表於2007-08-16
在Java1.5中增加了enum型別,使用enum型別的一些注意點[@more@]

注意點:
1。所有建立的列舉型別都擴充套件於 java.lang.Enum. Enum 是在J2SE 5.0 裡定義的一個新類, 它本身不是列舉型別.在建立列舉型別時,必須用enum 關鍵字,不能直接地定義一個繼承Enum的類來建立一個列舉型別,儘管所有建立的列舉型別實際上都是Enum 的子類.
2。列舉型別裡定義的每一個值都是列舉型別的一個例項,預設時都將對映到Enum(String name, int ordinal) 建構函式中.列舉型別可以使用引數為定義一些自己的建構函式。
另外要強調的兩點:
一是這些列舉型別的建構函式都是私有的.它是不能被其它的類或者其它的列舉型別呼叫的. 而且這個私有修飾符是由編譯器自動加的,如果我們定義這些建構函式時,在前面加上public 修飾符, 就會導致編譯錯誤,
二是變數定義必須在列舉型別值定義之後
3。 列舉型別每一個值都是public, static and final的.也就是說,這些值是唯一的而且一旦定義了是不能被重寫或修改.而且儘管在列舉型別每一個值宣告時沒有出現static關鍵字, 實際上值都是靜態的, 而且我們不能在值前面加上static, public,final 修飾符
4。Switch語句裡使用列舉型別時,一定不能在每一個列舉型別值的前面加上列舉型別的類名(case後面的值),否則編譯器就會報錯
5。 在J2SE 5.0 的java.util 程式包中提供兩個新類:EnumMap 和 EnumSet,這兩個類與列舉型別的結合應用可使以前非常繁瑣的程式變得簡單方便.EnumMap 類提供了java.util.Map 介面的一個特殊實現,該介面中的鍵(key)是一個列舉型別
6。特定於常量的類主體 :
提到列舉型別可以定義自己的函式,其實更進一步,列舉型別的每一個值都可以實現列舉型別裡定義的抽象函式

------------------------------------------
enum Size {
Small(0.8),
Medium(1.0),
Large(1.2);
private double pricingFactor; // 符合2.2的要求,變數定義必須在列舉型別值定義之後
Size(double p) {
pricingFactor = p;
}
public double getPricingFactor() {
return pricingFactor;
}
}
---------------------------------------------
enum的預定義方法
完整的方法集合(E 表示列舉型別自身):
* public int compareTo(E e)
* public boolean equals(Object o)
* public final Class getDeclaringClass()
* public int hashCode()
* public String name()
* public int ordinal()
* public String toString()
* public static > T valueOf(Class enumType, String name)

一些方法看起來很熟悉,而其他一些方法則是特定於 Enum 類的。
compareTo ()、equals() 和 hashCode() 方法是典型的 Object 和 Comparable 方法,其中,compareTo() 報告宣告元素的順序。name() 和 ordinal() 方法返回建構函式引數,而 toString() 返回名稱。

getDeclaringClass() 和 valueOf() 方法需要稍多一些解釋。getDeclaringClass() 方法類似於 Object 的 getClass() 方法,但它沒必要返回相同的類。根據這個方法的 Javadoc 的說明:對於具有特定於常量的類主體的 enum 常量,該方法返回的值可能不同於 Object.getClass() 方法返回的值。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/855/viewspace-960977/,如需轉載,請註明出處,否則將追究法律責任。

相關文章