JDK5.0新特性的學習--列舉

xuehongliang發表於2007-06-29

(1)簡單的例子

  JDK5.0的列舉,正好可以解決上面我們討論的問題,而且更簡潔。還是用上面的程式碼做示例,只需要將Color類修改如下,Flower、Client都無法更改。

 
java 程式碼
  1. public enum Color { RED, BLACK, YELLOW, BLUE, WHITE, ORANGE}
接下來我們做更深一步的說明: 
  • 所有列舉類都是java.lang.Enum的子類(JDK核心自動將Color隱性繼承自Enum)
  • RED...ORANGE都是Color的例項物件
 上面的Color列舉類,功能好象還和以前的例子不完全一樣,我們再次修改如下。
java 程式碼
  1. public enum Color {
  2. RED(0), BLACK(1), YELLOW(2), BLUE(3), WHITE(4), ORANGE(5);
  3. int color;
  4. Color(int color){
  5. this.color=color;
  6. }
  7. public int getColorValue(){
  8. return color;
  9. }
  10. }
從這裡我們可以看到列舉類是如何建立建構函式及方法的,有一些隱性的東西要說明一下: 
  • 列舉類的建構函式要求是private的,如果象例子裡那樣不加修飾符,則Java會自動給加上。但如果你想加上public則會報錯。
  • RED(0), BLACK(1)...等列舉值必須定義在前面,而且最後一個列舉值ORANGE(5);未尾用分號結束。

(2)在迴圈中使用列舉類

  列舉類都有一個values方法可以得到它值的陣列:Color[] colors=Color.values();而且列舉類都支援泛型

(以後的文章會重點說到),所以我們可以這樣來遍歷這個陣列:

Color[] colors = Color.values();
for (Color c : colors) {
System.out.println("color value=" + c.getColorValue());
}

(3)在switch(分支)中使用列舉

  如下程式碼示例,這裡要注意將“case RED:”寫成“case Color.RED:”是會報錯的,因為JDK5.0可以自動根據

“switch (color)”就判斷入你要使用什麼列舉型別了。從這裡也可以看出JDK5.0確實為使用者做了帖心的考慮,儘量讓程式設計師少寫程式碼,寫更簡單的程式碼。

Color color = Color.RED;
switch (color) {
case RED:
//process ...
break;
case BLACK:
//process ...
break;
case WHITE:
//process ...
break;
default:
//process ...
}

(4)JDK5.0新增的集合:EnumMap 和EnumSet

  給出兩個例子,一切盡在不言中了。(說明:這兩個例子用到了JDK5.0中泛型的知識)

Map map = new EnumMap(Color.class);
map.put(Color.RED, "紅色");
map.put(Color.BLACK, "黑色");
map.put(Color.WHITE, "白色");

for (Color c : Color.values()) {
System.out.println(c + " chinese is: " + map.get(c));
}

Set all = EnumSet.allOf(Color.class);
EnumSet warmColors = EnumSet.of(Color.RED, Color.YELLOW);
Set notWarmColors = EnumSet.complementOf(warmColors);
Set notBlack = EnumSet.range(Color.RED, Color.YELLOW);

[@more@]

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

相關文章