enum(枚舉)類(lèi)介紹
**java枚舉類(lèi)是一組預(yù)定義常量的集合,使用enum關(guān)鍵字聲明這個(gè)類(lèi),常量名稱(chēng)官方建議大寫(xiě) **
1.enum類(lèi)基本用法
舉一個(gè)常見(jiàn)的例子志于,例如星期就可以描述為一個(gè)枚舉類(lèi)夺饲,如下
public enum Day {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY,THURSDAY, FRIDAY, SATURDAY
}
怎么調(diào)用呢,Java switch語(yǔ)句參數(shù)就支持enum類(lèi)
public class EnumTest {
Day day;
public EnumTest(Day day) {
this.day = day;
}
public void tellItLikeItIs() {
switch (day) {
case MONDAY:
System.out.println("周一各種不在狀態(tài)");
break;
case FRIDAY:
System.out.println("周五感覺(jué)還不錯(cuò)");
break;
case SATURDAY: case SUNDAY:
System.out.println("周末給人的感覺(jué)是最棒的");
break;
default:
System.out.println("周內(nèi)感覺(jué)就那樣吧县钥。秀姐。。");
break;
}
}
public static void main(String[] args) {
EnumTest firstDay = new EnumTest(Day.MONDAY);
firstDay.tellItLikeItIs();
EnumTest thirdDay = new EnumTest(Day.WEDNESDAY);
thirdDay.tellItLikeItIs();
EnumTest fifthDay = new EnumTest(Day.FRIDAY);
fifthDay.tellItLikeItIs();
EnumTest sixthDay = new EnumTest(Day.SATURDAY);
sixthDay.tellItLikeItIs();
EnumTest seventhDay = new EnumTest(Day.SUNDAY);
seventhDay.tellItLikeItIs();
}
}
運(yùn)行結(jié)果
2.enum類(lèi)和static常量區(qū)別
看了上面的例子若贮,有些小伙伴就嗤之以鼻孔了省有,這沒(méi)什么嘛,java靜態(tài)常量也一樣可以辦到
public class EnumTest2 {
public static final int MONDAY= 1;
public static final int WEDNESDAY= 3;
public static final int FRIDAY= 5;
public static final int SATURDAY= 6;
public static final int SUNDAY= 7;
public void tellItLikeItIs(int day) {
switch (day) {
case 1:
System.out.println("周一各種不在狀態(tài)");
break;
case 5:
System.out.println("周五感覺(jué)還不錯(cuò)");
break;
case 6: case 7:
System.out.println("周末給人的感覺(jué)是最棒的");
break;
default:
System.out.println("周內(nèi)感覺(jué)就那樣吧谴麦。蠢沿。。");
break;
}
}
public static void main(String[] args) {
EnumTest2 firstDay = new EnumTest2();
firstDay.tellItLikeItIs(MONDAY);
EnumTest2 thirdDay = new EnumTest2();
thirdDay.tellItLikeItIs(WEDNESDAY);
EnumTest2 fifthDay = new EnumTest2();
fifthDay.tellItLikeItIs(FRIDAY);
EnumTest2 sixthDay = new EnumTest2();
sixthDay .tellItLikeItIs(SATURDAY);
EnumTest2 seventhDay = new EnumTest2();
seventhDay.tellItLikeItIs(SUNDAY);
}
}
在這個(gè)使用方式效果上來(lái)看是沒(méi)有區(qū)別的匾效,其實(shí)enum類(lèi)的每一個(gè)枚舉值也是 static final的舷蟀,但是我們?yōu)槭裁匆x擇使用enum枚舉類(lèi)呢
1.static方式的靜態(tài)變量類(lèi)型不安全,我們可以在調(diào)用的時(shí)候傳入其他值弧轧,導(dǎo)致錯(cuò)誤
例如: seventhDay.tellItLikeItIs(999);
2.static方式的靜態(tài)變量不支持屬性擴(kuò)展雪侥,每一個(gè)key對(duì)應(yīng)一個(gè)值,而enum的每一個(gè)key可以擁有自己的屬性
3.enum類(lèi)自定義屬性
這就是enum比static靜態(tài)變量好用的地方了精绎,可以賦予每一個(gè)枚舉值若干個(gè)屬性速缨,例如
public enum Day {
MONDAY(1, "星期一", "星期一各種不在狀態(tài)"),
TUESDAY(2, "星期二", "星期二依舊犯困"),
WEDNESDAY(3, "星期三", "星期三感覺(jué)半周終于過(guò)去了"),
THURSDAY(4, "星期四", "星期四期待這星期五"),
FRIDAY(5, "星期五", "星期五感覺(jué)還不錯(cuò)"),
SATURDAY(6, "星期六", "星期六感覺(jué)非常好"),
SUNDAY(7, "星期日", "星期日感覺(jué)周末還沒(méi)過(guò)夠。代乃。旬牲。");
Day(int index, String name, String value) {
this.index = index;
this.name = name;
this.value = value;
}
private int index;
private String name;
private String value;
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
這次測(cè)試類(lèi)就有些些變化了,更靈活了
public class EnumTest {
Day day;
public EnumTest(Day day) {
this.day = day;
}
public void tellItLikeItIs() {
switch (day) {
case MONDAY:
System.out.println(day.getName()+day.getValue());
break;
case FRIDAY:
System.out.println(day.getName()+day.getValue());
break;
case SATURDAY: case SUNDAY:
System.out.println(day.getName()+day.getValue());
break;
default:
System.out.println(day.getName()+day.getValue());
break;
}
}
public static void main(String[] args) {
EnumTest firstDay = new EnumTest(Day.MONDAY);
firstDay.tellItLikeItIs();
EnumTest thirdDay = new EnumTest(Day.WEDNESDAY);
thirdDay.tellItLikeItIs();
EnumTest fifthDay = new EnumTest(Day.FRIDAY);
fifthDay.tellItLikeItIs();
EnumTest sixthDay = new EnumTest(Day.SATURDAY);
sixthDay.tellItLikeItIs();
EnumTest seventhDay = new EnumTest(Day.SUNDAY);
seventhDay.tellItLikeItIs();
}
}
執(zhí)行結(jié)果
4.enum類(lèi)高級(jí)玩法
你以為enum這樣就完了么搁吓,還有更好玩的東西原茅,每一個(gè)enum枚舉值還可以擁有各自的內(nèi)部方法!二話(huà)不說(shuō)堕仔,上栗子
public enum Day {
MONDAY(1, "星期一", "各種不在狀態(tài)"){
@Override
public Day getNext() {
return TUESDAY;
}
},
TUESDAY(2, "星期二", "依舊犯困"){
@Override
public Day getNext() {
return WEDNESDAY;
}
},
WEDNESDAY(3, "星期三", "感覺(jué)半周終于過(guò)去了"){
@Override
public Day getNext() {
return THURSDAY;
}
},
THURSDAY(4, "星期四", "期待這星期五"){
@Override
public Day getNext() {
return FRIDAY;
}
},
FRIDAY(5, "星期五", "感覺(jué)還不錯(cuò)"){
@Override
public Day getNext() {
return SATURDAY;
}
},
SATURDAY(6, "星期六", "感覺(jué)非常好"){
@Override
public Day getNext() {
return SUNDAY;
}
},
SUNDAY(7, "星期日", "感覺(jué)周末還沒(méi)過(guò)夠擂橘。。摩骨。"){
@Override
public Day getNext() {
return MONDAY;
}
};
Day(int index, String name, String value) {
this.index = index;
this.name = name;
this.value = value;
}
private int index;
private String name;
private String value;
public abstract Day getNext();
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
調(diào)用下看看
public class EnumTest {
Day day;
public EnumTest(Day day) {
this.day = day;
}
public void tellItLikeItIs() {
switch (day) {
case MONDAY:
System.out.println(day.getName()+day.getValue());
System.out.println(day.getName()+"的下一天是"+day.getNext().getName());
break;
case FRIDAY:
System.out.println(day.getName()+day.getValue());
System.out.println(day.getName()+"的下一天是"+day.getNext().getName());
break;
case SATURDAY: case SUNDAY:
System.out.println(day.getName()+day.getValue());
System.out.println(day.getName()+"的下一天是"+day.getNext().getName());
break;
default:
System.out.println(day.getName()+day.getValue());
System.out.println(day.getName()+"的下一天是"+day.getNext().getName());
break;
}
}
public static void main(String[] args) {
EnumTest firstDay = new EnumTest(Day.MONDAY);
firstDay.tellItLikeItIs();
EnumTest thirdDay = new EnumTest(Day.WEDNESDAY);
thirdDay.tellItLikeItIs();
EnumTest fifthDay = new EnumTest(Day.FRIDAY);
fifthDay.tellItLikeItIs();
EnumTest sixthDay = new EnumTest(Day.SATURDAY);
sixthDay.tellItLikeItIs();
EnumTest seventhDay = new EnumTest(Day.SUNDAY);
seventhDay.tellItLikeItIs();
}
}
執(zhí)行結(jié)果
5.參照文檔
http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html