一、枚舉類的使用
- 枚舉類的理解:類的對象只有有限個(gè)颅筋,確定的。稱此類為枚舉類
- 當(dāng)需要定義一組常量時(shí)狡恬,強(qiáng)烈建議使用枚舉類
- 如果枚舉只有一個(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();
}