Java枚舉類筆記

一、枚舉類的使用

  1. 枚舉類的理解:類的對象只有有限個(gè)颅筋,確定的。稱此類為枚舉類
  2. 當(dāng)需要定義一組常量時(shí)狡恬,強(qiáng)烈建議使用枚舉類
  3. 如果枚舉只有一個(gè)對象, 則可以作為一種單例模式的實(shí)現(xiàn)方式厌处。

枚舉舉例:

  • 星期:Monday(星期一)行瑞、......叹阔、Sunday(星期天)
  • 性別:Man(男)截酷、Woman(女)
  • 季節(jié):Spring(春節(jié))......Winter(冬天)
  • 支付方式:Cash(現(xiàn)金)蔓同、WeChatPay(微信)饶辙、Alipay(支付寶)、BankCard(銀行卡)斑粱、CreditCard(信用卡)
  • 就職狀態(tài):Busy弃揽、Free、Vocation则北、Dimission
  • 訂單狀態(tài):Nonpayment(未付款)矿微、Paid(已付款)、Delivered(已發(fā)貨)尚揣、Return(退貨)涌矢、Checked(已確認(rèn))、Fulfilled(已配貨)
  • 線程狀態(tài):創(chuàng)建快骗、就緒蒿辙、運(yùn)行拇泛、阻塞、死亡

二思灌、如何定義枚舉類

方式一:jdk5.0之前俺叭,自定義枚舉類

class Season {
    // 1.聲明Season對象屬性:private final修飾
    private final String name;

    // 2.私有化類的構(gòu)造器,并給對象屬性賦值
    private Season(String name) {
        this.name = name;
    }

    // 3.提供當(dāng)前枚舉類的多個(gè)對象:public static final的
    public static final Season SPRING = new Season("春天");
    public static final Season SUMMER = new Season("夏天");
    public static final Season AUTUM = new Season("秋天");
    public static final Season WINTER = new Season("冬天");

    // 4.其他需求:獲取枚舉類對象的屬性
    public String getName() {
        return name;
    }

    // 5.其他需求:提供toString()
    @Override
    public String toString() {
        return "Season [name=" + name + "]";
    }

}
@Test
public void testSeason() {
  Season spring = Season.SPRING;
  System.out.println(spring);  //輸出:Season [name=春天]
}

提供了一個(gè)季節(jié)類(Season)泰偿,這個(gè)類中只有4個(gè)對象(春熄守、夏、秋耗跛、冬)裕照,所以這個(gè)類是一個(gè)枚舉類。由于對象是有限個(gè)的调塌,所有沒有公開構(gòu)造器晋南,只在類的內(nèi)部提供,所以需要在類的內(nèi)部構(gòu)造“春羔砾、夏负间、秋、冬”這4個(gè)對象姜凄,然后依據(jù)實(shí)際需求政溃,可以提供getXXX()或者toString()方法。

方式二:jdk5.0時(shí)态秧,使用enum關(guān)鍵字定義枚舉類

使用enum定義的枚舉類董虱,默認(rèn)繼承于java.lang.Enum類,Enum類重寫了Object類的toString()方法申鱼。

  • 使用enum定義的枚舉類默認(rèn)繼承了java.lang.Enum類愤诱,因此不能再繼承其他類
  • 枚舉類的構(gòu)造器只能使用private權(quán)限修飾符
  • 枚舉類的所有實(shí)例必須在枚舉類中顯式列出(","分隔,";"結(jié)尾)捐友。列出的實(shí)例系統(tǒng)會(huì)自動(dòng)添加public static final修飾
  • 必須在枚舉類的第一行聲明枚舉類對象
  • 枚舉變量可以使用equals和==進(jìn)行比較转锈,結(jié)果是一樣的
  • 枚舉值是有順序的,可以比較大小楚殿。枚舉類型都有一個(gè)方法int ordinal(),表示枚舉值在聲明時(shí)的順序竿痰,從0開始
  • 枚舉類型都實(shí)現(xiàn)了Java API中的Comparable接口脆粥,都可以通過方法compareTo與其他枚舉值進(jìn)行比較。比較其實(shí)就是比較ordinal的大小
  • 枚舉還可以用于switch語句影涉;在switch語句內(nèi)部变隔,枚舉值不能帶枚舉類型前綴;
// 使用enum定義枚舉類
// 說明:定義的枚舉類默認(rèn)繼承于java.lang.Enum類
enum Gender {
    
    // 1.提供當(dāng)前枚舉類的對象蟹倾,多個(gè)對象之間用“,”隔開匣缘,末尾對象“;”結(jié)束
    Man("男"), Woman("女");

    // 2.聲明Gender對象的屬性:private final修飾
    private final String gender;

    // 3.私有化類的構(gòu)造器猖闪,并給對象屬性賦值
    Gender(String gender) {
        this.gender = gender;
    }

    // 4.其他需求:獲取枚舉類對象的屬性
    public String getGender() {
        return gender;
    }

}


@Test
public void testGender() {
  Gender man = Gender.Man;
  System.out.println(man);  // Man
}

三、Enum類的常用方法

Enum類有name和ordinal兩個(gè)實(shí)例變量肌厨,在構(gòu)造方法中需要傳遞培慌。

主要方法:

  • values() 方法:返回枚舉類型的對象數(shù)組。該方法可以很方便地遍歷所有的枚舉值柑爸。
  • valueOf(String str):可以把一個(gè)字符串轉(zhuǎn)為對應(yīng)的枚舉類對象吵护。要求字符串必須是枚舉類對象的“名字”。如不是表鳍,會(huì)有運(yùn)行時(shí)異常:IllegalArgumentException馅而。
  • toString():返回當(dāng)前枚舉類對象常量的名稱

其他方法:

例:

values()方法

@Test
public void testEnumValues() {
  Gender[] genders = Gender.values();
  for (Gender gender : genders) {
    System.out.println(gender);
  }
}
/*
 * Man
 * Woman
 */

valueOf(String str)方法

@Test
public void testEnumvalueOf() {
  Gender gender = Gender.valueOf("Man");
  System.out.println(gender+":"+gender.getClass().getName()); // Man:com.basic.day22.Gender
}

四、使用enum關(guān)鍵字定義的枚舉類實(shí)現(xiàn)接口

  • 和普通Java類一樣譬圣,枚舉類可以實(shí)現(xiàn)一個(gè)或多個(gè)接口
  • 若每個(gè)枚舉值在調(diào)用實(shí)現(xiàn)的接口方法呈現(xiàn)相同的行為方式瓮恭,則只要統(tǒng)一實(shí)現(xiàn)該方法即可。
  • 若需要每個(gè)枚舉值在調(diào)用實(shí)現(xiàn)的接口方法呈現(xiàn)出不同的行為方式厘熟,則可以讓每個(gè)枚舉值分別來實(shí)現(xiàn)該方法
  • 抽象枚舉類:枚舉類型可以聲明抽象方法屯蹦,每個(gè)枚舉值中可以實(shí)現(xiàn)該方法,也可以重寫枚舉類型的其他方法(與實(shí)現(xiàn)接口的方式類似)

讓枚舉類的對象分別實(shí)現(xiàn)接口中的抽象方法:

interface Info{
    void show();
}

// 枚舉類中的對象分別實(shí)現(xiàn)接口中的抽象方法
enum Gender implements Info {
    Man("男"){
        @Override
        public void show() {
            System.out.println("我是男的");
        }
    }, Woman("女"){
        @Override
        public void show() {
            System.out.println("我是女的");
        }
    };

    private final String gender;

    Gender(String gender) {
        this.gender = gender;
    }

    public String getGender() {
        return gender;
    }
}
@Test
public void testEnumInterface() {
  Gender man = Gender.Man;
  man.show();
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末盯漂,一起剝皮案震驚了整個(gè)濱河市颇玷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌就缆,老刑警劉巖帖渠,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異竭宰,居然都是意外死亡空郊,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進(jìn)店門切揭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來狞甚,“玉大人,你說我怎么就攤上這事廓旬『呱螅” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵孕豹,是天一觀的道長涩盾。 經(jīng)常有香客問我,道長励背,這世上最難降的妖魔是什么春霍? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮叶眉,結(jié)果婚禮上址儒,老公的妹妹穿的比我還像新娘芹枷。我一直安慰自己,他們只是感情好莲趣,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布鸳慈。 她就那樣靜靜地躺著,像睡著了一般妖爷。 火紅的嫁衣襯著肌膚如雪蝶涩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天絮识,我揣著相機(jī)與錄音绿聘,去河邊找鬼。 笑死次舌,一個(gè)胖子當(dāng)著我的面吹牛熄攘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播彼念,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼挪圾,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了逐沙?” 一聲冷哼從身側(cè)響起哲思,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吩案,沒想到半個(gè)月后棚赔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡徘郭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年靠益,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片残揉。...
    茶點(diǎn)故事閱讀 38,163評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡胧后,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出抱环,到底是詐尸還是另有隱情壳快,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布镇草,位于F島的核電站眶痰,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏陶夜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一裆站、第九天 我趴在偏房一處隱蔽的房頂上張望条辟。 院中可真熱鬧黔夭,春花似錦、人聲如沸羽嫡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽杭棵。三九已至婚惫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間魂爪,已是汗流浹背先舷。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留滓侍,地道東北人蒋川。 一個(gè)月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像撩笆,于是被迫代替她去往敵國和親捺球。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評論 2 344

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