java enum枚舉類的用法以及高級玩法


enum(枚舉)類介紹

**java枚舉類是一組預定義常量的集合,使用enum關鍵字聲明這個類,常量名稱官方建議大寫 **

1.enum類基本用法

舉一個常見的例子,例如星期就可以描述為一個枚舉類,如下

public enum Day { SUNDAY, MONDAY, TUESDAY, WEDNESDAY,THURSDAY, FRIDAY, SATURDAY } 

怎么調用呢,Java switch語句參數就支持enum類

public class EnumTest { Day day; public EnumTest(Day day) { this.day = day; } public void tellItLikeItIs() { switch (day) { case MONDAY: System.out.println("周一各種不在狀態"); break; case FRIDAY: System.out.println("周五感覺還不錯"); break; case SATURDAY: case SUNDAY: System.out.println("周末給人的感覺是最棒的"); break; default: System.out.println("周內感覺就那樣吧。。。"); 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(); } } 

運行結果

 
EnumTest類運行結果.png

2.enum類和static常量區別

看了上面的例子,有些小伙伴就嗤之以鼻孔了,這沒什么嘛,java靜態常量也一樣可以辦到

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("周一各種不在狀態"); break; case 5: System.out.println("周五感覺還不錯"); break; case 6: case 7: System.out.println("周末給人的感覺是最棒的"); break; default: System.out.println("周內感覺就那樣吧。。。"); 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); } } 

在這個使用方式效果上來看是沒有區別的,其實enum類的每一個枚舉值也是 static final的,但是我們為什么要選擇使用enum枚舉類呢
1.static方式的靜態變量類型不安全,我們可以在調用的時候傳入其他值,導致錯誤
例如: seventhDay.tellItLikeItIs(999);
2.static方式的靜態變量不支持屬性擴展,每一個key對應一個值,而enum的每一個key可以擁有自己的屬性

3.enum類自定義屬性

這就是enum比static靜態變量好用的地方了,可以賦予每一個枚舉值若干個屬性,例如

public enum Day { MONDAY(1, "星期一", "星期一各種不在狀態"), TUESDAY(2, "星期二", "星期二依舊犯困"), WEDNESDAY(3, "星期三", "星期三感覺半周終於過去了"), THURSDAY(4, "星期四", "星期四期待這星期五"), FRIDAY(5, "星期五", "星期五感覺還不錯"), SATURDAY(6, "星期六", "星期六感覺非常好"), SUNDAY(7, "星期日", "星期日感覺周末還沒過夠。。。"); 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; } } 

這次測試類就有些些變化了,更靈活了

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(); } } 

執行結果

 
EnumTest類運行結果.png

4.enum類高級玩法

你以為enum這樣就完了么,還有更好玩的東西,每一個enum枚舉值還可以擁有各自的內部方法!二話不說,上栗子

public enum Day { MONDAY(1, "星期一", "各種不在狀態"){ @Override public Day getNext() { return TUESDAY; } }, TUESDAY(2, "星期二", "依舊犯困"){ @Override public Day getNext() { return WEDNESDAY; } }, WEDNESDAY(3, "星期三", "感覺半周終於過去了"){ @Override public Day getNext() { return THURSDAY; } }, THURSDAY(4, "星期四", "期待這星期五"){ @Override public Day getNext() { return FRIDAY; } }, FRIDAY(5, "星期五", "感覺還不錯"){ @Override public Day getNext() { return SATURDAY; } }, SATURDAY(6, "星期六", "感覺非常好"){ @Override public Day getNext() { return SUNDAY; } }, SUNDAY(7, "星期日", "感覺周末還沒過夠。。。"){ @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; } } 

調用下看看

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(); } } 

執行結果

 
EnumTest類運行結果.png

作為一種長度固定,數據未定的一種存儲數據集的數據類型,枚舉類有如下方法可供參考。


普通類型的枚舉類的創建

protected enum ColorEnum{ red,orange,yellow,green,blue,purple } 

是的,就是這樣,聲明就可以了。


既然有普通類型,當然也會有不普通類型的了,接下來的是可以在枚舉類中添加屬性的枚舉,如下

public enum SeasonEnum{ spring,summer,fall,winter; private final static String position="test"; public static SeasonEnum getSeason(){ if(position.equals("test")){ return summer; }else{ return winter; } } } 

其中作為屬性的position便是外界對此枚舉類操作的一個“算子”,當然也可以用普通的枚舉方式來對枚舉進行處理


然后是帶有構造器的枚舉類的使用
需要注意的是,在使用構造器的時候,要帶參數就都帶,否則就都不帶,因為聲明了帶參數的構造器后,默認的無參的構造器將不再起作用

public enum GenderEnum{ MAN("MAN"),WOMAN("WOMAN"); //代表一個成員變量,便於賦值和獲取數據 private String value; GenderEnum(String gender){ this.value=gender; } //成員變量值的get方法 public String getValue(){ return value; } } 

帶有抽象方法的枚舉類的使用

public enum PersonInfo{ NAME{public String getName(){return "S**";}}, AGE{public String getName(){return "**";}}, ADDRESS{public String getName(){ return "*南省**市**縣";}}, E_MAIL{public String getName(){return "1064*****2@qq.com";}}; //這個方法就是一個抽象的方法 public abstract String getName(); } 

下面是一個具體的小例子:

package test; public class Test { public static void main(String[] args) { System.out.println(WeekDay.FRIDAY.getInfo()); } } enum WeekDay{ MONDAY("周一"){ @Override public String getInfo() { // TODO Auto-generated method stub return this.getValue(); }} ,TWESDAY("周二"){ @Override public String getInfo() { // TODO Auto-generated method stub return this.getValue(); }} ,WENDESDAY("周三"){ @Override public String getInfo() { // TODO Auto-generated method stub return this.getValue(); }} ,YHURSDAY("周四"){ @Override public String getInfo() { // TODO Auto-generated method stub return this.getValue(); }} ,FRIDAY("周五"){ @Override public String getInfo() { // TODO Auto-generated method stub return this.getValue(); }} ,SATASDAY("周六"){ @Override public String getInfo() { // TODO Auto-generated method stub return this.getValue(); }} ,SUNDAY("周日"){ @Override public String getInfo() { // TODO Auto-generated method stub return this.getValue(); }}; private String value; public String getValue() { return value; } private WeekDay(String value){ this.value = value; } public abstract String getInfo(); } 

程序輸出結果:

周五


小總結:

  • 其實枚舉也就是一個特殊的類,其中的實例就是其對象,其中的成員變量和成員函數也都是屬於每一個實例。
  • 通過這樣的方式,我們就可以使枚舉類擁有更多的信息(如果只設置一個實例,那么這就是一個單例模式的較好的體現,可以保證在內存中只有一個這樣的對象存在!
  • 對每一個實例都實現了抽象的方法的目的就是讓每一個對象攜帶自身具備的唯一的信息。

總結:
對於枚舉類的使用,有普通類型,帶有變化屬性,帶有構造器,帶有抽象方法的枚舉等等。各有各的特點,使用的時候視情況而定!還可以應用於單態模式,豈不快哉?







免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM