在Switch語句裡使用枚舉類型時,一定不能在每一個枚舉類型值的前面加上枚舉類型 的類名,否則編譯器就會報錯(會導致編譯錯誤???). 我們把上面的程序稍作修改,在 case 語句裡加上枚舉類型的類名並運行在Eclipse 3.1 平台上. 我們發現Eclipse 的問 題視圖裡提示case 語句裡枚舉類型值的前面加上枚舉類型的類名是錯誤的, 如下圖8所 示.
圖7: case 語句裡枚舉類型的值
原因是J2SE 5.0的實現要求case 語句裡每一個枚舉類型值是不能有枚舉類型類作為前 綴的.前面談到過每一個枚舉類型的值都是枚舉類型的一個實例.那麼當編譯器編譯case語 句時, 是如何處理這些實例的? 這有兩種情況:如果switch 與枚舉類型定義在同一個編 譯單元, 第一次編譯時一個新表會創建在內存裡. 在這個表裡, 每一個枚舉類型的值都和 它在枚舉類型裡定義的順序關聯起來. 編譯器編譯結果就和下面清單9顯示的的程序很像. 只不過順序號沒有加到程序裡, 而是編譯器在表裡快速查詢. 如果枚舉類型被修改或從定 義,表會被更新.
清單 9:
public class TestSwitch (
Task task = new Task();
switch (task.getPriority( )) {
case 0:
//do case High
break;
case 1: // fall through to Low
case 2:
//do case Low
break;
default: throw new AssertionError("Unexpected enumerated value!");
}
}
還有一種經常出現的情況是 switch 與枚舉類型定義不是在同一個編譯單元.在這種情 況下, 大多數編譯器就會把switch-case 語句翻譯成一系列的if/else 語句:
清單 10:
Priority tmp = task.getPriority( );
if (tmp == High)
//do case High
else if (tmp == Midium)
else if (tmp == Low)
//do case Low
else {
throw new AssertionError("Unexpected enumerated value!");
}
1.3.3 Maps of Enum and Sets of Enum
在J2SE 5.0 的java.util 程序包中提供兩個新類:EnumMap 和 EnumSet,這兩個類與 枚舉類型的結合應用可使以前非常繁瑣的程序變得簡單方便.EnumMap 類提供了 Java.util.Map 接口的一個特殊實現,該接口中的鍵(key)是一個枚舉類型.
清單 11:. EnumMap 例子
public void test() throws IOException {
EnumMap<Priority, String> descriptionMessages =
new EnumMap< Priority, String>( Priority.class);
descriptionMessages.put(Priority.High, "High means ...");
descriptionMessages.put(Priority.Medium, " Medium represents...");
descriptionMessages.put(Priority.Low, " Low means...");
for (Priority p : Priority.values( ) ) {
System.out.println("For priority " + p + ", decription is: " +
descriptionMessages.get(p));
}
}