在現實社會中,有些類的實例對象是固定的。例如季節,只有春夏秋冬。如果你創建了一個season類,你當然有義務維護這個類的實例對象只能是春(SPRING)、夏(SUMMER)、秋(AUTUMN)、冬(WINTER)這四個。這個時候就體現出枚舉類的作用了,java中枚舉類型就是針對這樣的場景需求所設計的。
/** * 枚舉類的后綴建議為Enum,枚舉類型的實例對象建議全大寫(這樣做符合JAVA的規范) */ public enum SeasonEnum{ SPRING,SUMMER,AUTUMN,WINTER }
讓我們來看看怎么使用SeasonEnum這個枚舉類。
public class Test{ public static void main(String[] args) { String summer = SUMMER; //通過valueOf,獲取SUMMER的枚舉類型 SeasonEnum season2 = SeasonEnum.valueOf(summer); //直接初始化 SeasonEnum season1 = SeasonEnum.SPRING; switch (season1) { case SPRING: System.out.println(“春天”); break; case SUMMER: System.out.println(“夏天”); break; case AUTUMN: System.out.println(“秋天”); break; case WINTER: System.out.println(“冬天”); break; } } }
創建SeasonEnum枚舉類,在使用的時候利用switch語句進行匹配從而得到相應的輸出值,這種做法很常見。如果只需要實現這樣的功能,定義一個常量類也可以實現。那么就讓我們更進一步來看看枚舉類的作用,針對上面的例子,如果我們在很多場景下都要通過SeasonEnum的實例對象獲取相對應的中文,每次都使用switch語句就顯得代碼冗余。我們這樣設想一下,當我們創建SeasonEnum這個枚舉類時,可不可以讓SeasonEnum中的每一個實例對象都有一個getChinese()方法呢。答案是肯定的,而且這種做法在企業開發中很常見。
public enum SeasonEnum { //枚舉類的實例對象必須在最前面先定義,而且必須每個實例對象都必須維護上chinese成員變量 SPRING("春天"),SUMMER("夏天"),AUMUTN("秋天"),WINTER("冬天"); private String chinese; //枚舉類型的構造函數默認為private,因為枚舉類型的初始化要在當前枚舉類中完成。 SeasonEnum (String chinese){ this.chinese= chinese; } public String getChinese(){ return chinese; } }
這樣乍一看是不是有點像我們平時創建一般實體類一樣。其實枚舉類型可以看做我們平時新建.class差不多,只是枚舉類限制了此類的實例對象。當然,枚舉類可以有自己的成員變量和方法。上面的SeasonEnum 枚舉類有了chinese這個成員變量,所以我們在定義實例對象時就要維護這個chinese成員變量。現在再來看看,我們是怎么使用這個枚舉類簡化我們的代碼。
public class Test{ public static void main(String[] args) { //直接初始化 SeasonEnum season1 = SeasonEnum.SPRING; //調用SeasonEnum枚舉類的getChinese()方法獲取SPRING的中文值 System.out.println(season1.getChinese()); } }
-------------------------------------------------------
枚舉
注意:枚舉是單例的,單例要保證私有化構造器。
1. 如何自定義枚舉類
- 提供類的屬性,聲明為 private final
- 聲明為 final 的屬性,在構造器中初始化
- 通過公共方法(get)方法來調用屬性
- 創建枚舉類的對象:將類的對象聲明 public static final
舉例如下:
public class Season { //1. 提供類的屬性,聲明為 private final private final String seasonName; private final String seasonDesc; //2. 聲明為 final 的屬性,在構造器中初始化 private Season (String seasonName, String seasonDesc) { this.seasonName = seasonName; this.seasonDesc = seasonDesc; } //3. 通過公共的方法來調用屬性 public String getSeasonName() { return seasonName; } public String getSeasonDesc() { return seasonDesc; } //4. 創建枚舉類的對象:將類的對象聲明 public static final public static final Season SPRING = new Season("spring", "春暖花開"); public static final Season SUMMER = new Season("summer", "夏日炎炎"); public static final Season AUTUMN = new Season("autumn", "秋高氣爽"); public static final Season WINTER = new Season("winter", "白雪皚皚"); @Override public String toString() { return "Season [seasonName=" + seasonName + ", seasonDesc=" + seasonDesc + "]"; } public void show() { System.out.println("這是一個季節"); } public static void main(String[] args) { Season spring = Season.SPRING; System.out.println(spring); spring.show(); System.out.println(spring.getSeasonName()); } }

2. 如何使用 enum 關鍵字來定義枚舉類
將對象放到最前面,並且不需要定義對象的其他屬性。
使用 enum 類來定義枚舉類,可以使用下述兩種方法來返回值。
- values() 方法:返回所有值
- valueOf() 方法:返回指定對象的值(要求傳入的形參name是枚舉類對象的名字)
否則,報 java.lang.IllegalArgumentException 異常
改造一下上述代碼:
enum SeasonEnum { SPRING("spring", "春暖花開"), SUMMER("summer", "夏日炎炎"), AUTUMN("autumn", "秋高氣爽"), WINTER("winter", "白雪皚皚"); private final String seasonName; private final String seasonDesc; private SeasonEnum (String seasonName, String seasonDesc) { this.seasonName = seasonName; this.seasonDesc = seasonDesc; } public String getSeasonName() { return seasonName; } public String getSeasonDesc() { return seasonDesc; } @Override public String toString() { return "Season [seasonName=" + seasonName + ", seasonDesc=" + seasonDesc + "]"; } public void show() { System.out.println("這是一個季節"); } public static void main(String[] args) { SeasonEnum spring = SeasonEnum.SPRING; System.out.println(spring); spring.show(); System.out.println(spring.getSeasonName()); System.out.println("-------------------"); // 1. values() 方法:返回所有值 SeasonEnum[] seasons = SeasonEnum.values(); for (int i = 0; i < seasons.length; i++) { System.out.println(seasons[i]); } System.out.println("-------------------"); // 2. valueOf() 方法:返回指定對象的值(要求傳入的形參name是枚舉類對象的名字) // 否則,報 java.lang.IllegalArgumentException 異常 String str = "SPRING"; SeasonEnum sea = SeasonEnum.valueOf(str); System.out.println(sea); } }

3. 枚舉類實現接口
可以讓不同的枚舉類的對象調用被重寫的抽象方法,執行的效果不同。(相當於讓每個對象重寫抽象方法)
改造如下:
interface Info { void show(); }
enum SeasonEnumTest implements Info { SPRING("spring", "春暖花開"){ public void show() { System.out.println("春天在哪里?"); } }, SUMMER("summer", "夏日炎炎"){ public void show() { System.out.println("夏天在哪里?"); } }, AUTUMN("autumn", "秋高氣爽"){ public void show() { System.out.println("秋天在哪里?"); } }, WINTER("winter", "白雪皚皚"){ public void show() { System.out.println("冬天在哪里?"); } }; private final String seasonName; private final String seasonDesc; private SeasonEnumTest(String seasonName, String seasonDesc) { this.seasonName = seasonName; this.seasonDesc = seasonDesc; } public String getSeasonName() { return seasonName; } public String getSeasonDesc() { return seasonDesc; } @Override public String toString() { return "Season [seasonName=" + seasonName + ", seasonDesc=" + seasonDesc + "]"; } public void show() { System.out.println("這是一個季節"); } public static void main(String[] args) { SeasonEnumTest spring = SeasonEnumTest.SPRING; System.out.println(spring); spring.show(); System.out.println(spring.getSeasonName()); System.out.println("-------------------"); // 1. values() 方法:返回所有值 SeasonEnumTest[] seasons = SeasonEnumTest.values(); for (int i=0; i<seasons.length;i++) { System.out.println(seasons[i]); } System.out.println("-------------------"); // 2. valueOf() 方法:返回指定對象的值(要求傳入的形參name是枚舉類對象的名字) // 否則,報 java.lang.IllegalArgumentException 異常 String str = "WINTER"; SeasonEnumTest sea = SeasonEnumTest.valueOf(str); System.out.println(sea); sea.show(); } }

出處:https://www.e-learn.cn/content/java/2584441
https://blog.csdn.net/cauchy6317/article/details/82313088
