枚舉Enum

一、為什么需要枚舉

舉個(gè)例子程梦,生物界性別分“雄性”点把、“雌性”和“中性”,將其定義為靜態(tài)常量:

public class Gender{
    public static final int Male = 1;
    public static final int Female = 2;
    public static final int Neutral = 3;
}

對(duì)于這種單值類(lèi)型的靜態(tài)常量定義屿附,本身也沒(méi)錯(cuò)郎逃,主要是在使用的地方?jīng)]有一個(gè)明確性的約束而已,比如這里的 judgeGender 方法的本意是傳入 Gender 的三種靜態(tài)常量之一挺份,但由于沒(méi)有類(lèi)型上的約束褒翰,因此傳入任意一個(gè) int 值都是可以的,編譯器也不會(huì)提出任何警告。

void judgeGender(int code){}

但是在枚舉類(lèi)型出現(xiàn)之后优训,上面這種情況就可以用枚舉嚴(yán)謹(jǐn)?shù)厝ゼs束朵你,比如用枚舉去定義性別就非常簡(jiǎn)潔了:

public enum Gender {
    Male, Female, Neutral
}

而且主要是在用枚舉的地方會(huì)有更強(qiáng)的類(lèi)型約束。如下入?yún)㈩?lèi)型就會(huì)受到明確的類(lèi)型約束揣非,一旦傳入無(wú)效值抡医,編譯器就會(huì)幫檢查,從而規(guī)避潛在問(wèn)題早敬。除此之外魂拦,枚舉在擴(kuò)展性方面比普通常量更方便、也更優(yōu)雅搁嗓。

//入?yún)⒕拖薅祟?lèi)型
void judgeGender(Gender gender){}

綜上芯勘,枚舉的意義:
1??封裝有限的變化,提高代碼維護(hù)性腺逛,確保變量合法荷愕。
如果利用 int 類(lèi)型表示星期一到星期日的話,就要判斷輸入 int 變量不在 1-7 的范圍內(nèi)的情況棍矛。
2??代碼更優(yōu)雅安疗,提高代碼可讀性。一個(gè)復(fù)制的程序里面够委,可能要用到成百上千的靜態(tài)常量荐类,如果全寫(xiě)在一個(gè)文件里面,容易造成命名混淆茁帽,程序讀起來(lái)也比較麻煩玉罐。

二、單值枚舉

定義一個(gè)性別枚舉:

public enum Gender {
    Male, Female, Neutral
}

枚舉的所有基本用法:

public class judgeGender {
    public static void main(String[] args) {
        for (Gender genderType : Gender.values()) {
            System.out.println(genderType);
        }
        Gender male = Gender.Male;
        Gender female = Gender.Female;
        Gender neutral = Gender.Neutral;
        System.out.println(male.ordinal());//0
        System.out.println(female.ordinal());//1
        System.out.println(neutral.ordinal());//2
        System.out.println(male.name());//Male
        System.out.println(female.name());//Female
        System.out.println(neutral.name());//Neutral
        System.out.println(male.compareTo(male));//0
        System.out.println(male.compareTo(female));//-1
        System.out.println(female.compareTo(neutral));//-1
        System.out.println(Gender.valueOf("Male"));//Male
        System.out.println(Gender.valueOf("Female"));//Female
        System.out.println(Gender.valueOf("Neutral"));//Neutral
        Gender gender = Gender.Male;
        switch (gender) {
            case Male:
                System.out.println("男");
                break;
            case Female:
                System.out.println("女");
                break;
            case Neutral:
                System.out.println("中性");
                break;
        }//男
    }
}

compareTo

三潘拨、多值枚舉

上面展示的枚舉例子非常簡(jiǎn)單吊输,僅僅是單值的情形,而實(shí)際項(xiàng)目中用枚舉往往是多值用法铁追。擴(kuò)充一下上面的 Gender 枚舉季蚂,在里面加入 【說(shuō)明 -- 編碼】的對(duì)應(yīng)關(guān)系,這也是實(shí)際項(xiàng)目中常用的用法琅束∨てǎ可以在枚舉里自定義各種屬性、構(gòu)造函數(shù)涩禀、甚至各種方法:

public enum GenterType {

    Male("男", "01"),
    Female("女", "02"),
    Neutral("中性", "03"),
    ;

    //自定義屬性
    private final String explain;
    private final String code;
    public String getExplain() {
        return explain;
    }
    public String getCode() {
        return code;
    }
    //自定義構(gòu)造函數(shù)
    GenterType(String explain, String code) {
        this.explain = explain;
        this.code = code;
    }
}

從上述代碼可知料滥,在 enum 枚舉類(lèi)中完全可以像在普通 Class 里一樣聲明屬性、構(gòu)造函數(shù)以及成員方法埋泵。

四幔欧、專(zhuān)門(mén)用于枚舉的集合類(lèi)

一般習(xí)慣于使用諸如:HashMap 和 HashSet 等集合來(lái)盛放元素罪治。而對(duì)于枚舉,有專(zhuān)門(mén)的集合類(lèi): EnumSet 和 EnumMap

1??EnumSet

EnumSet 是專(zhuān)門(mén)為盛放枚舉類(lèi)型所設(shè)計(jì)的 Set 類(lèi)型礁蔗。

2??EnumMap

EnumMap 則是用來(lái)專(zhuān)門(mén)盛放枚舉類(lèi)型為 key 的 Map 類(lèi)型觉义。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市浴井,隨后出現(xiàn)的幾起案子晒骇,更是在濱河造成了極大的恐慌,老刑警劉巖磺浙,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件洪囤,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡撕氧,警方通過(guò)查閱死者的電腦和手機(jī)瘤缩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)伦泥,“玉大人剥啤,你說(shuō)我怎么就攤上這事〔桓” “怎么了府怯?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)防楷。 經(jīng)常有香客問(wèn)我牺丙,道長(zhǎng),這世上最難降的妖魔是什么复局? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任冲簿,我火速辦了婚禮,結(jié)果婚禮上肖揣,老公的妹妹穿的比我還像新娘民假。我一直安慰自己,他們只是感情好龙优,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著事秀,像睡著了一般彤断。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上易迹,一...
    開(kāi)封第一講書(shū)人閱讀 49,772評(píng)論 1 290
  • 那天宰衙,我揣著相機(jī)與錄音,去河邊找鬼睹欲。 笑死供炼,一個(gè)胖子當(dāng)著我的面吹牛一屋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播袋哼,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼冀墨,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了涛贯?” 一聲冷哼從身側(cè)響起诽嘉,我...
    開(kāi)封第一講書(shū)人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎弟翘,沒(méi)想到半個(gè)月后虫腋,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡稀余,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年悦冀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片睛琳。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡盒蟆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出掸掏,到底是詐尸還是另有隱情茁影,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布丧凤,位于F島的核電站募闲,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏愿待。R本人自食惡果不足惜浩螺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望仍侥。 院中可真熱鬧要出,春花似錦、人聲如沸农渊。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)砸紊。三九已至传于,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間醉顽,已是汗流浹背沼溜。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留游添,地道東北人系草。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓通熄,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親找都。 傳聞我的和親對(duì)象是個(gè)殘疾皇子唇辨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348