javaenum詳解
① java的enum到底有什麼用
簡單的說,枚舉就像是一個常量的集合,到時候只用其中一個值判斷。
如:enum.winter
if(string.equals(enum.winter)){
System.out.println("winter");
}
else
if(string.equals(enum.spring)){
System.out.println("spring");
}
在項目中都是
類似的用途
別的用途也有
不太熟
呵呵
② java中的enum有什麼用呢
enum也就是枚舉,像一個集合,只不過集合裡面的內容都固定了.
public enum Season3 {
SPRING("春天"),
SUMMER("夏天"),
AUTUMN("秋天"),
WINTER("冬天");
private String name;
private Season3(String name){
this.name = name;
}
public double getAvgTemp(){
switch(this){
case SPRING:return 10.2;
case SUMMER:return 25.8;
case AUTUMN:return 19.6;
case WINTER:return -3.6;
}
return 0.0;
}
public String getName(){
return name;
}
}
public class Test {
public static void main(String[] args) {
m3(Season3.SPRING);
}
public static void m3(Season3 season){
System.out.println(season.getName()+":"+season.getAvgTemp());
Season3[] allSeason = Season3.values();//返回枚舉類中所有枚舉值的一個數組
System.out.println(allSeason[0]);
}
}
③ java 什麼叫枚舉型
Enum作為Sun全新引進的一個關鍵字,看起來很象是特殊的class, 它也可以有自己的變數,可以定義自己的方法,可以實現一個或者多個介面。當我們在聲明一個enum類型時,我們應該注意到enum類型有如下的一些特徵。
1.它不能有public的構造函數,這樣做可以保證客戶代碼沒有辦法新建一個enum的實例。
2.所有枚舉值都是public , static , final的。注意這一點只是針對於枚舉值,我們可以和在普通類裡面定義變數一樣定義其它任何類型的非枚舉變數,這些變數可以用任何你想用的修飾符。
3.Enum默認實現了java.lang.Comparable介面。
4.Enum覆載了了toString方法,因此我們如果調用Color.Blue.toString()默認返回字元串」Blue」.
5.Enum提供了一個valueOf方法,這個方法和toString方法是相對應的。調用valueOf(「Blue」)將返回Color.Blue.因此我們在自己重寫toString方法的時候就要注意到這一點,一把來說應該相對應地重寫valueOf方法。
6.Enum還提供了values方法,這個方法使你能夠方便的遍歷所有的枚舉值。
7.Enum還有一個oridinal的方法,這個方法返回枚舉值在枚舉類種的順序,這個順序根據枚舉值聲明的順序而定,這里Color.Red.ordinal()返回0。
1.遍歷所有有枚舉值. 知道了有values方法,我們可以輕車熟路地用ForEach循環來遍歷了枚舉值了。
for (Color c: Color.values())
System.out.println(「find value:」 + c);
2.在enum中定義方法和變數,比如我們可以為Color增加一個方法隨機返回一個顏色。
public enum Color {
Red,
Green,
Blue;
private static int number = Color.values().length ;
public static Color getRandomColor(){
long random = System.currentTimeMillis() % number;
switch ((int) random){
case 0:
return Color.Red;
case 1:
return Color.Green;
case 2:
return Color.Blue;
default : return Color.Red;
}
}
}
可以看出這在枚舉類型里定義變數和方法和在普通類裡面定義方法和變數沒有什麼區別。唯一要注意的只是變數和方法定義必須放在所有枚舉值定義的後面,否則編譯器會給出一個錯誤。
3.覆載(Override)toString, valueOf方法。
前面我們已經知道enum提供了toString,valueOf等方法,很多時候我們都需要覆載默認的toString方法,那麼對於enum我們怎麼做呢。其實這和覆載一個普通class的toString方法沒有什麼區別。
….
public String toString(){
switch (this){
case Red:
return "Color.Red";
case Green:
return "Color.Green";
case Blue:
return "Color.Blue";
default:
return "Unknow Color";
}
}
….
這時我們可以看到,此時再用前面的遍歷代碼列印出來的是
Color.Red
Color.Green
Color.Blue
而不是
Red
Green
Blue.
可以看到toString確實是被覆載了。一般來說在覆載toString的時候我們同時也應該覆載valueOf方法,以保持它們相互的一致性。
4.使用構造函數。
雖然enum不可以有public的構造函數,但是我們還是可以定義private的構造函數,在enum內部使用。還是用Color這個例子。
public enum Color {
Red("This is Red"),
Green("This is Green"),
Blue("This is Blue");
private String desc;
Color(String desc){
this.desc = desc;
}
public String getDesc(){
return this.desc;
}
}
這里我們為每一個顏色提供了一個說明信息
public enum Color {
Red {
public String toString(){
return "Color.Red";
}
},
Green {
public String toString(){
return "Color.Green";
}
},
Blue{
public String toString(){
return "Color.Blue";
}
};
}
, 然後定義了一個構造函數接受這個說明信息。
要注意這里構造函數不能為public或者protected, 從而保證構造函數只能在內部使用,客戶代碼不能new一個枚舉值的實例出來。這也是完全符合情理的,因為我們知道枚舉值是public static final的常量而已。
5.實現特定的介面
我們已經知道enum可以定義變數和方法,它要實現一個介面也和普通class實現一個介面一樣,這里就不作示例了。
6.定義枚舉值自己的方法。
前面我們看到可以為enum定義一些方法,其實我們甚至可以為每一個枚舉值定義方法。這樣,我們前面覆載 toString的例子可以被改寫成這樣。
從邏輯上來說這樣比原先提供一個「全局「的toString方法要清晰一些。
總的來說,enum作為一個全新定義的類型,是希望能夠幫助程序員寫出的代碼更加簡單易懂,個人覺得一般也不需要過多的使用enum的一些高級特性,否則就和簡單易懂的初衷想違背了。
④ ENUM的Enum的用法(JAVA版)
引入了enum的java的列舉的編寫方便了許多,只須定義一個enum型的對象.enum對象的值都會自動獲得一個數字值,從0開始,依次遞增.看一個比較簡單的enum實現的例子: EnumDemo.javapackagenet.javagarage.enums;/*()method.,calledEnumDemo$Seasons.class*/publicclassEnumDemo{/*.notethat,likein#,wedon'tsea『;』*/privateenumSeasons{winter,spring,summer,fall}//(String[]args){for(Seasonss:Seasons.values()){System.out.println(s);}}}運行上述代碼你會得到 以下結果:
winter
spring
summer
fall 下面的代碼展示了調用enum對象的方法,這也是它通常的用法: packagenet.javagarage.enums;/*File:EnumSwitch.javaPurpose:.*/publicclassEnumSwitch{privateenumColor{red,blue,green}//(String[]args){//refertothequalifiedvaluedoIt(Color.red);}/*.thatis,caseColor.red:isacompilererror*/privatestaticvoiddoIt(Colorc){switch(c){casered:System.out.println(valueis+Color.red);break;casegreen:System.out.println(valueis+Color.green);break;caseblue:System.out.println(valueis:+Color.blue);break;default:System.out.println(default);}}}為Enums添加屬性和方法
enums也可以象一般的類一樣添加方法和屬性,你可以為它添加靜態和非靜態的屬性或方法,這一切都象你在一般的類中做的那樣.
就是這么的簡單.但是有一點是需要注意的,那就是enums的值列表必須緊跟在enum聲明,不然編譯時將會出錯.
Enums構造函數:
和類一樣enums也可以有自己的構造函數
盡管enums有這么多的屬性,但並不是用的越多越好,如果那樣還不如直接用類來的直接.enums的優勢在定義int最終變數僅當這些值有一定特殊含義時.但是如果你需要的是一個類,就定義一個類,而不是enum.
⑤ enum是java關鍵字嗎
enum是Java的關鍵字,Java的關鍵字如下:
abstract 表明類或者成員方法具有抽象屬性
assert 用來進行程序調試
boolean 基本數據類型之一,布爾類型
break 提前跳出一個塊
byte 基本數據類型之一,位元組類型
case 用在switch語句之中,表面其中的一個分支
catch 用在異常處理中,用來捕捉異常
char 基本數據類型之一,字元類型
class 類
const 保留關鍵字,沒有具體含義
continue 回到一個塊的開始處
default 默認,例如,用在switch語句中,表明一個默認的分支
do 用在do-while循環結構中
double 基本數據類型之一,雙精度浮點數類型
else 用在條件語句中,表明當條件不成立時的分支
enum 枚舉
extends 表明一個類型是另一個類型的子類型,這里常見的類型有類和介面
final 用來說明最終屬性,表明一個類不能派生出子類,或者成員方法不能被覆蓋,或者成員域的值不能被改變
finally 用於處理異常情況,用來聲明一個基本肯定會被執行到的語句塊
float 基本數據類型之一,單精度浮點數類型
for 一種循環結構的引導詞
goto 保留關鍵字,沒有具體含義
if 條件語句的引導詞
implements 表明一個類實現了給定的介面
import 表明要訪問指定的類或包
instanceof 用來測試一個對象是否是指定類型的實例對象
int 基本數據類型之一,整數類型
interface 介面
long 基本數據類型之一,長整數類型
native 用來聲明一個方法是由與計算機相關的語言(如C/C++/FORTRAN語言)實現的
new 用來創建新實例對象
package 包
private 一種訪問控制方式:私用模式
protected 一種訪問控制方式:保護模式
public 一種訪問控制方式:共用模式
return 從成員方法中返回數據
short 基本數據類型之一,短整數類型
static 表明具有靜態屬性
strictfp 用來聲明FP_strict(單精度或雙精度浮點數)表達式遵循IEEE 754算術規范
super 表明當前對象的父類型的引用或者父類型的構造方法
switch 分支語句結構的引導詞
sychronized 表明一段代碼需要同步執行
this 指向當前實例對象的引用
throw 拋出一個異常
throws 聲明在當前定義的成員方法中所有需要拋出的異常
transient 聲明不用序列化的成員域
try 嘗試一個可能拋出異常的程序塊
void 聲明當前成員方法沒有返回值
volatile 表明兩個或者多個變數必須同步地發生變化
while 用在循環結構中
⑥ java裡面的enum該怎麼用
enum是枚舉類。
通常用public final static方法定義常量,在枚舉類中則可以直接定義。
例如:
123public enum Light { RED, GREEN, YELLOW; }
⑦ java enum類型
這里是自己定義了toString函數,也就是重寫了這個函數。java里很多類都定義了toString方法,作用是將類的內容轉化為可見的字元串便於顯示。這里重寫了toString同樣也是這個作用。
⑧ 介紹一下java枚舉,順便舉個例子,謝謝
package com.ljq.test;
/**
* 枚舉用法詳解
*
* @author jiqinlin
*
*/
public class TestEnum {
/**
* 普通枚舉
*
* @author jiqinlin
*
*/
public enum ColorEnum {
red, green, yellow, blue;
}
/**
* 枚舉像普通的類一樣可以添加屬性和方法,可以為它添加靜態和非靜態的屬性或方法
*
* @author jiqinlin
*
*/
public enum SeasonEnum {
//註:枚舉寫在最前面,否則編譯出錯
spring, summer, autumn, winter;
private final static String position = "test";
public static SeasonEnum getSeason() {
if ("test".equals(position))
return spring;
else
return winter;
}
}
/**
* 性別
*
* 實現帶有構造器的枚舉
*
* @author jiqinlin
*
*/
public enum Gender{
//通過括弧賦值,而且必須帶有一個參構造器和一個屬性跟方法,否則編譯出錯
//賦值必須都賦值或都不賦值,不能一部分賦值一部分不賦值;如果不賦值則不能寫構造器,賦值編譯也出錯
MAN("MAN"), WOMEN("WOMEN");
private final String value;
//構造器默認也只能是private, 從而保證構造函數只能在內部使用
Gender(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
/**
* 訂單狀態
*
* 實現帶有抽象方法的枚舉
*
* @author jiqinlin
*
*/
public enum OrderState {
/** 已取消 */
CANCEL {public String getName(){return "已取消";}},
/** 待審核 */
WAITCONFIRM {public String getName(){return "待審核";}},
/** 等待付款 */
WAITPAYMENT {public String getName(){return "等待付款";}},
/** 正在配貨 */
ADMEASUREPRODUCT {public String getName(){return "正在配貨";}},
/** 等待發貨 */
WAITDELIVER {public String getName(){return "等待發貨";}},
/** 已發貨 */
DELIVERED {public String getName(){return "已發貨";}},
/** 已收貨 */
RECEIVED {public String getName(){return "已收貨";}};
public abstract String getName();
}
public static void main(String[] args) {
//枚舉是一種類型,用於定義變數,以限制變數的賦值;賦值時通過「枚舉名.值」取得枚舉中的值
ColorEnum colorEnum = ColorEnum.blue;
switch (colorEnum) {
case red:
System.out.println("color is red");
break;
case green:
System.out.println("color is green");
break;
case yellow:
System.out.println("color is yellow");
break;
case blue:
System.out.println("color is blue");
break;
}
//遍歷枚舉
System.out.println("遍歷ColorEnum枚舉中的值");
for(ColorEnum color : ColorEnum.values()){
System.out.println(color);
}
//獲取枚舉的個數
System.out.println("ColorEnum枚舉中的值有"+ColorEnum.values().length+"個");
//獲取枚舉的索引位置,默認從0開始
System.out.println(ColorEnum.red.ordinal());//0
System.out.println(ColorEnum.green.ordinal());//1
System.out.println(ColorEnum.yellow.ordinal());//2
System.out.println(ColorEnum.blue.ordinal());//3
//枚舉默認實現了java.lang.Comparable介面
System.out.println(ColorEnum.red.compareTo(ColorEnum.green));//-1
//--------------------------
System.out.println("===========");
System.err.println("季節為" + SeasonEnum.getSeason());
//--------------
System.out.println("===========");
for(Gender gender : Gender.values()){
System.out.println(gender.value);
}
//--------------
System.out.println("===========");
for(OrderState order : OrderState.values()){
System.out.println(order.getName());
}
}
}
⑨ 關於java中的enum類型
所有自行編寫的 枚舉類 都默認自動繼承 java.lang.Enum<E extends Enum<E>> 。
其中 java.lang.Enum 類的 toString() 方法說明:返回枚舉常量的名稱,它包含在聲明中。
這意味著你自行編寫的 枚舉類 都默認繼承這個 toString 方法的邏輯。
詳細見API文檔。
⑩ enum在java中是什麼意思
Enum 類型的介紹
枚舉類型(Enumerated Type) 很早就出現在編程語言中,它被用來將一組類似的值包含到一種類型當中。而這種枚舉類型的名稱則會被定義成獨一無二的類型描述符,在這一點上和常量的定義相似。不過相比較常量類型,枚舉類型可以為申明的變數提供更大的取值范圍。
舉個例子來說明一下,如果希望為彩虹描繪出七種顏色,你可以在 Java 程序中通過常量定義方式來實現。
清單 1. 常量定義
PublicstaticclassRainbowColor{
//紅橙黃綠青藍紫七種顏色的常量定義
publicstaticfinalintRED=0;
publicstaticfinalintORANGE=1;
publicstaticfinalintYELLOW=2;
publicstaticfinalintGREEN=3;
publicstaticfinalintCYAN=4;
publicstaticfinalintBLUE=5;
publicstaticfinalintPURPLE=6;
}
使用的時候,你可以在程序中直接引用這些常量。但是,這種方式還是存在著一些問題。
類型不安全
由於顏色常量的對應值是整數形,所以程序執行過程中很有可能給顏色變數傳入一個任意的整數值,導致出現錯誤。
沒有命名空間
由於顏色常量只是類的屬性,當你使用的時候不得不通過類來訪問。
一致性差
因為整形枚舉屬於編譯期常量,所以編譯過程完成後,所有客戶端和伺服器端引用的地方,會直接將整數值寫入。這樣,當你修改舊的枚舉整數值後或者增加新的枚舉值後,所有引用地方代碼都需要重新編譯,否則運行時刻就會出現錯誤。
類型無指意性
由於顏色枚舉值僅僅是一些無任何含義的整數值,如果在運行期調試時候,你就會發現日誌中有很多魔術數字,但除了程序員本身,其他人很難明白其奧秘。
如何定義 Enum 類型
為了改進 Java 語言在這方面的不足彌補缺陷,5.0 版本 SDK 發布時候,在語言層面上增加了枚舉類型。枚舉類型的定義也非常的簡單,用 enum 關鍵字加上名稱和大括弧包含起來的枚舉值體即可,例如上面提到的彩虹顏色就可以用新的 enum 方式來重新定義:
enumRainbowColor{RED,ORANGE,YELLOW,GREEN,CYAN,BLUE,PURPLE}
從上面的定義形式來看,似乎 Java 中的枚舉類型很簡單,但實際上 Java 語言規范賦予枚舉類型的功能非常的強大,它不僅是簡單地將整形數值轉換成對象,而是將枚舉類型定義轉變成一個完整功能的類定義。這種類型定義的擴展允許開發者給枚舉類型增加任何方法和屬性,也可以實現任意的介面。另外,Java 平台也為 Enum 類型提供了高質量的實現,比如默認實現 Comparable 和 Serializable 介面,讓開發者一般情況下不用關心這些細節。
回到本文的主題上來,引入枚舉類型到底能夠給我們開發帶來什麼樣好處呢?一個最直接的益處就是擴大 switch 語句使用范圍。5.0 之前,Java 中 switch 的值只能夠是簡單類型,比如 int、byte、short、char, 有了枚舉類型之後,就可以使用對象了。這樣一來,程序的控制選擇就變得更加的方便,看下面的例子:
清單 2. 定義 Enum 類型
//定義一周七天的枚舉類型
publicenumWeekDayEnum{Mon,Tue,Wed,Thu,Fri,Sat,Sun}
//讀取當天的信息
WeekDayEnumtoday=readToday();
//根據日期來選擇進行活動
switch(today){
Mon:dosomething;break;
Tue:dosomething;break;
Wed:dosomething;break;
Thu:dosomething;break;
Fri:dosomething;break;
Sat:playsportsgame;break;
Sun:havearest;break;
}
對於這些枚舉的日期,JVM 都會在運行期構造成出一個簡單的對象實例一一對應。這些對象都有唯一的 identity,類似整形數值一樣,switch 語句就根據此來進行執行跳轉。
如何定製 Enum 類型
除了以上這種最常見的枚舉定義形式外,如果需要給枚舉類型增加一些復雜功能,也可以通過類似 class 的定義來給枚舉進行定製。比如要給 enum 類型增加屬性,可以像下面這樣定義:
清單 3. 定製枚舉類型
//定義RSS(ReallySimpleSyndication)種子的枚舉類型
publicenumNewsRSSFeedEnum{
//雅虎頭條新聞RSS種子
YAHOO_TOP_STORIES("http://rss.news.yahoo.com/rss/topstories"),
//CBS頭條新聞RSS種子
CBS_TOP_STORIES("http://feeds.cbsnews.com/CBSNewsMain?format=xml"),
//洛杉磯時報頭條新聞RSS種子
LATIMES_TOP_STORIES("http://feeds.latimes.com/latimes/news?format=xml");
//枚舉對象的RSS地址的屬性
privateStringrss_url;
//枚舉對象構造函數
privateNewsRSSFeedEnum(Stringrss){
this.rss_url=rss;
}
//枚舉對象獲取RSS地址的方法
publicStringgetRssURL(){
returnthis.rss_url;
}
}
上面頭條新聞的枚舉類型增加了一個 RSS 地址的屬性 , 記錄頭條新聞的訪問地址。同時,需要外部傳入 RSS 訪問地址的值,因而需要定義一個構造函數來初始化此屬性。另外,還需要向外提供方法來讀取 RSS 地址。
如何避免錯誤使用 Enum
不過在使用 Enum 時候有幾個地方需要注意:
enum 類型不支持 public 和 protected 修飾符的構造方法,因此構造函數一定要是 private 或 friendly 的。也正因為如此,所以枚舉對象是無法在程序中通過直接調用其構造方法來初始化的。
定義 enum 類型時候,如果是簡單類型,那麼最後一個枚舉值後不用跟任何一個符號;但如果有定製方法,那麼最後一個枚舉值與後面代碼要用分號';'隔開,不能用逗號或空格。
由於 enum 類型的值實際上是通過運行期構造出對象來表示的,所以在 cluster 環境下,每個虛擬機都會構造出一個同義的枚舉對象。因而在做比較操作時候就需要注意,如果直接通過使用等號 ( 『 == 』 ) 操作符,這些看似一樣的枚舉值一定不相等,因為這不是同一個對象實例。
看下面的這個例子:
清單 4. 避免錯誤使用 Enum 示例
//定義一個一周七天的枚舉類型
packageexample.enumeration.codes;
publicenumWeekDayEnum{
Mon(1),Tue(2),Wed(3),Thu(4),Fri(5),Sat(6),Sun(7);
privateintindex;
WeekDayEnum(intidx){
this.index=idx;
}
publicintgetIndex(){
returnindex;
}
}
//客戶端程序,將一個枚舉值通過網路傳遞給伺服器端
packageexample.enumeration.codes;
importjava.io.IOException;
importjava.io.ObjectOutputStream;
importjava.io.OutputStream;
importjava.net.InetSocketAddress;
importjava.net.Socket;
importjava.net.UnknownHostException;
publicclassEnumerationClient{
publicstaticvoidmain(String...args)throwsUnknownHostException,IOException{
Socketsocket=newSocket();
//建立到伺服器端的連接
socket.connect(newInetSocketAddress("127.0.0.1",8999));
//從連接中得到輸出流
OutputStreamos=socket.getOutputStream();
ObjectOutputStreamoos=newObjectOutputStream(os);
//將星期五這個枚舉值傳遞給伺服器端
oos.writeObject(WeekDayEnum.Fri);
oos.close();
os.close();
socket.close();
}
}
//伺服器端程序,將從客戶端收到的枚舉值應用到邏輯處理中
packageexample.enumeration.codes;
importjava.io.*;
importjava.net.ServerSocket;
importjava.net.Socket;
publicclassEnumerationServer{
publicstaticvoidmain(String...args)throwsIOException,ClassNotFoundException{
ServerSocketserver=newServerSocket(8999);
//建立伺服器端的網路連接偵聽
Socketsocket=server.accept();
//從連接中獲取輸入流
InputStreamis=socket.getInputStream();
ObjectInputStreamois=newObjectInputStream(is);
//讀出客戶端傳遞來的枚舉值
WeekDayEnumday=(WeekDayEnum)ois.readObject();
//用值比較方式來對比枚舉對象
if(day==WeekDayEnum.Fri){
System.out.println("'s");
}elseif(day.equals(WeekDayEnum.Fri)){
System.out.println("'s");
}else{
System.out.println("'s");
}
//用switch方式來比較枚舉對象
switch(day){
caseMon:
System.out.println("DoMondaywork");
break;
caseTue:
System.out.println("DoTuesdaywork");
break;
caseWed:
System.out.println("DoWednesdaywork");
break;
caseThu:
System.out.println("DoThursdaywork");
break;
caseFri:
System.out.println("DoFridaywork");
break;
caseSat:
System.out.println("DoSaturdaywork");
break;
caseSun:
System.out.println("DoSundaywork");
break;
default:
System.out.println("Idon'tknowwhichisday");
break;
}
ois.close();
is.close();
socket.close();
}
}
列印結果如下:
client Friday enum value is same as server's
Do Friday work
通過程序執行結果,我們能夠發現在分布式條件下客戶端和服務端的虛擬機上都生成了一個枚舉對象,即使看起來一樣的 Fri 枚舉值,如果使用等號『 == 』進行比較的話會出現不等的情況。而 switch 語句則是通過 equal 方法來比較枚舉對象的值,因此當你的枚舉對象較復雜時候,你就需要小心 override 與比較相關的方法,防止出現值比較方面的錯誤。
Enum 相關工具類
JDK5.0 中在增加 Enum 類的同時,也增加了兩個工具類 EnumSet 和 EnumMap,這兩個類都放在 java.util 包中。EnumSet 是一個針對枚舉類型的高性能的 Set 介面實現。EnumSet 中裝入的所有枚舉對象都必須是同一種類型,在其內部,是通過 bit-vector 來實現,也就是通過一個 long 型數。EnumSet 支持在枚舉類型的所有值的某個范圍中進行迭代。回到上面日期枚舉的例子上:
enumWeekDayEnum{Mon,Tue,Wed,Thu,Fri,Sat,Sun}
你能夠在每周七天日期中進行迭代,EnumSet 類提供一個靜態方法 range 讓迭代很容易完成:
for(WeekDayEnumday:EnumSet.range(WeekDayEnum.Mon,WeekDayEnum.Fri)){
System.out.println(day);
}
列印結果如下:
Mon
Tue
Wed
Thu
Fri
EnumSet 還提供了很多個類型安全的獲取子集的 of 方法,使你很容易取得子集:
EnumSet<WeekDayEnum>subset=EnumSet.of(WeekDayEnum.Mon,WeekDayEnum.Wed);
for(WeekDayEnumday:subset){
System.out.println(day);
}
列印結果如下:
Mon
Wed
與 EnumSet 類似,EnumMap 也是一個高性能的 Map 介面實現,用來管理使用枚舉類型作為 keys 的映射表,內部是通過數組方式來實現。EnumMap 將豐富的和安全的 Map 介面與數組快速訪問結合到一起,如果你希望要將一個枚舉類型映射到一個值,你應該使用 EnumMap。看下面的例子:
清單 5. EnumMap 示例
//定義一個EnumMap對象,映射表主鍵是日期枚舉類型,值是顏色枚舉類型
privatestaticMap<WeekDayEnum,RainbowColor>schema=
newEnumMap<WeekDayEnum,RainbowColor>(WeekDayEnum.class);
static{
//將一周的每一天與彩虹的某一種色彩映射起來
for(inti=0;i<WeekDayEnum.values().length;i++){
schema.put(WeekDayEnum.values()[i],RainbowColor.values()[i]);
}
}
System.out.println("Whatistheluckycolortoday?");
System.out.println("It's"+schema.get(WeekDayEnum.Sat));
當你詢問周六的幸運色彩時候,會得到藍色:
清單 6. 運行結果
What is the lucky color today?
It's BLUE
結束語
Enum 類型提出給 JAVA 編程帶了了極大的便利,讓程序的控制更加的容易,也不容易出現錯誤。所以在遇到需要控製程序流程時候,可以多想想是否可以利用 enum 來實現。