java枚舉類

Java 枚舉7常見種用法
DK1.5引入了新的類型——枚舉画恰。在 Java 中它雖然算個“小”功能财喳,卻給我的開發(fā)帶來了“大”方便侄榴。
用法一:常量
在JDK1.5 之前遭贸,我們定義常量都是: public static fianl.... 「昕龋現(xiàn)在好了,有了枚舉壕吹,可以把相關(guān)的常量分組到一個枚舉類型里著蛙,而且枚舉提供了比常量更多的方法。

Java代碼

public enum Color {
RED, GREEN, BLANK, YELLOW
}

用法二:switch
JDK1.6之前的switch語句只支持int,char,enum類型耳贬,使用枚舉踏堡,能讓我們的代碼可讀性更強。

Java代碼

enum Signal {
GREEN, YELLOW, RED
}
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;
}
}
}

用法三:向枚舉中添加新方法
如果打算自定義自己的方法咒劲,那么必須在enum實例序列的最后添加一個分號顷蟆。而且 Java 要求必須先定義 enum 實例。

Java代碼

public enum Color {
RED("紅色", 1), GREEN("綠色", 2), BLANK("白色", 3), YELLO("黃色", 4);
// 成員變量
private String name;
private int index;
// 構(gòu)造方法
private Color(String name, int index) {
this.name = name;
this.index = index;
}
// 普通方法
public static String getName(int index) {
for (Color c : Color.values()) {
if (c.getIndex() == index) {
return c.name;
}
}
return null;
}
// get set 方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
}

用法四:覆蓋枚舉的方法
下面給出一個toString()方法覆蓋的例子腐魂。

Java代碼

public enum Color {
RED("紅色", 1), GREEN("綠色", 2), BLANK("白色", 3), YELLO("黃色", 4);
// 成員變量
private String name;
private int index;
// 構(gòu)造方法
private Color(String name, int index) {
this.name = name;
this.index = index;
}
//覆蓋方法
@Override
public String toString() {
return this.index+"_"+this.name;
}
}

用法五:實現(xiàn)接口
所有的枚舉都繼承自java.lang.Enum類帐偎。由于Java 不支持多繼承,所以枚舉對象不能再繼承其他類蛔屹。

Java代碼

public interface Behaviour {
void print();
String getInfo();
}
public enum Color implements Behaviour{
RED("紅色", 1), GREEN("綠色", 2), BLANK("白色", 3), YELLO("黃色", 4);
// 成員變量
private String name;
private int index;
// 構(gòu)造方法
private Color(String name, int index) {
this.name = name;
this.index = index;
}
//接口方法
@Override
public String getInfo() {
return this.name;
}
//接口方法
@Override
public void print() {
System.out.println(this.index+":"+this.name);
}
}

用法六:使用接口組織枚舉

Java代碼

public interface Food {
enum Coffee implements Food{
BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO
}
enum Dessert implements Food{
FRUIT, CAKE, GELATO
}
}

用法七:關(guān)于枚舉集合的使用
java.util.EnumSet和java.util.EnumMap是兩個枚舉集合削樊。EnumSet保證集合中的元素不重復;EnumMap中的 key是enum類型兔毒,而value則可以是任意類型漫贞。關(guān)于這個兩個集合的使用就不在這里贅述,可以參考JDK文檔育叁。
關(guān)于枚舉的實現(xiàn)細節(jié)和原理請參考:
參考資料:《ThinkingInJava》第四版
http://softbeta.iteye.com/blog/1185573

二绕辖、為什么不用靜態(tài)常量來替代枚舉類呢?
public static final int SEASON_SPRING = 1; public static final int SEASON_SUMMER = 2; public static final int SEASON_FALL = 3; public static final int SEASON_WINTER = 4;

枚舉類更加直觀擂红,類型安全仪际。使用常量會有以下幾個缺陷:
  1. 類型不安全。若一個方法中要求傳入季節(jié)這個參數(shù)昵骤,用常量的話树碱,形參就是int類型,開發(fā)者傳入任意類型的int類型值就行变秦,但是如果是枚舉類型的話成榜,就只能傳入枚舉類中包含的對象。
  2. 沒有命名空間蹦玫。開發(fā)者要在命名的時候以SEASON_開頭赎婚,這樣另外一個開發(fā)者再看這段代碼的時候刘绣,才知道這四個常量分別代表季節(jié)。
三挣输、枚舉類入門
  先看一個簡單的枚舉類纬凤。
package enumcase;

public enum SeasonEnum {
SPRING,SUMMER,FALL,WINTER;
}

enum和class、interface的地位一樣
使用enum定義的枚舉類默認繼承了java.lang.Enum撩嚼,而不是繼承Object類停士。枚舉類可以實現(xiàn)一個或多個接口。
枚舉類的所有實例都必須放在第一行展示完丽,不需使用new 關(guān)鍵字恋技,不需顯式調(diào)用構(gòu)造器。自動添加public static final修飾逻族。
使用enum定義蜻底、非抽象的枚舉類默認使用final修飾,不可以被繼承聘鳞。
枚舉類的構(gòu)造器只能是私有的朱躺。

四、枚舉類介紹
  枚舉類內(nèi)也可以定義屬性和方法搁痛,可是是靜態(tài)的和非靜態(tài)的长搀。
package enumcase;

public enum SeasonEnum {
SPRING("春天"),SUMMER("夏天"),FALL("秋天"),WINTER("冬天");

private final String name;

private SeasonEnum(String name)
{
    this.name = name;
}

public String getName() {
    return name;
}

}

實際上在第一行寫枚舉類實例的時候,默認是調(diào)用了構(gòu)造器的鸡典,所以此處需要傳入?yún)?shù)源请,因為沒有顯式申明無參構(gòu)造器,只能調(diào)用有參數(shù)的構(gòu)造器彻况。
  構(gòu)造器需定義成私有的谁尸,這樣就不能在別處申明此類的對象了。枚舉類通常應(yīng)該設(shè)計成不可變類纽甘,它的Field不應(yīng)該被改變良蛮,這樣會更安全,而且代碼更加簡潔悍赢。所以我們將Field用private final修飾决瞳。

五、枚舉類實現(xiàn)接口
  枚舉類可以實現(xiàn)一個或多個接口左权。與普通類一樣皮胡,實現(xiàn)接口的時候需要實現(xiàn)接口中定義的所有方法,若沒有完全實現(xiàn)赏迟,那這個枚舉類就是抽象的屡贺,只是不需顯式加上abstract修飾,系統(tǒng)化會默認加上。
  
package enumcase;

public enum Operation {
PLUS{

    @Override
    public double eval(double x, double y) {
        return x + y;
    }
    
},
MINUS{

    @Override
    public double eval(double x, double y) {
        return x - y;
    }
    
},
TIMES{

    @Override
    public double eval(double x, double y) {
        return x * y;
    }
    
},
DIVIDE{

    @Override
    public double eval(double x, double y) {
        return x / y;
    }
    
};

/**
 * 抽象方法甩栈,由不同的枚舉值提供不同的實現(xiàn)泻仙。
 * @param x
 * @param y
 * @return
 */
public abstract double eval(double x, double y);

public static void main(String[] args) {
    System.out.println(Operation.PLUS.eval(10, 2));
    System.out.println(Operation.MINUS.eval(10, 2));
    System.out.println(Operation.TIMES.eval(10, 2));
    System.out.println(Operation.DIVIDE.eval(10, 2));
}

}

Operatio類實際上是抽象的,不可以創(chuàng)建枚舉值量没,所以此處在申明枚舉值的時候玉转,都實現(xiàn)了抽象方法,這其實是匿名內(nèi)部類的實現(xiàn)允蜈,花括號部分是一個類體。我們可以看下編譯以后的文件蒿柳。

  

  共生成了五個class文件饶套,這樣就證明了PLUS,MINUS,TIMES,DIVIDE是Operation的匿名內(nèi)部類的實例。

六垒探、switch語句里的表達式可以是枚舉值
  Java5新增了enum關(guān)鍵字妓蛮,同時擴展了switch。
package enumcase;

public class SeasonTest {
public void judge(SeasonEnum s)
{
switch(s)
{
case SPRING:
System.out.println("春天適合踏青圾叼。");
break;
case SUMMER:
System.out.println("夏天要去游泳啦蛤克。");
break;
case FALL:
System.out.println("秋天一定要去旅游哦。");
break;
case WINTER:
System.out.println("冬天要是下雪就好啦夷蚊。");
break;
}
}

public static void main(String[] args) {
    SeasonEnum s = SeasonEnum.SPRING;
    SeasonTest test = new SeasonTest();
    test.judge(s);
}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末构挤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子惕鼓,更是在濱河造成了極大的恐慌筋现,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件箱歧,死亡現(xiàn)場離奇詭異矾飞,居然都是意外死亡,警方通過查閱死者的電腦和手機呀邢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門洒沦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人价淌,你說我怎么就攤上這事申眼。” “怎么了蝉衣?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵豺型,是天一觀的道長。 經(jīng)常有香客問我买乃,道長姻氨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任剪验,我火速辦了婚禮肴焊,結(jié)果婚禮上前联,老公的妹妹穿的比我還像新娘。我一直安慰自己娶眷,他們只是感情好似嗤,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著届宠,像睡著了一般烁落。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上豌注,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天伤塌,我揣著相機與錄音,去河邊找鬼轧铁。 笑死每聪,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的齿风。 我是一名探鬼主播药薯,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼救斑!你這毒婦竟也來了童本?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤脸候,失蹤者是張志新(化名)和其女友劉穎巾陕,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纪他,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡鄙煤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了茶袒。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梯刚。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖薪寓,靈堂內(nèi)的尸體忽然破棺而出亡资,到底是詐尸還是另有隱情,我是刑警寧澤向叉,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布锥腻,位于F島的核電站,受9級特大地震影響母谎,放射性物質(zhì)發(fā)生泄漏瘦黑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望幸斥。 院中可真熱鬧匹摇,春花似錦、人聲如沸甲葬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽经窖。三九已至坡垫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間画侣,已是汗流浹背冰悠。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留棉钧,地道東北人屿脐。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓涕蚤,卻偏偏與公主長得像宪卿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子万栅,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容