一、枚舉基礎java
1.一、建立枚舉最簡單的方式this
1.二、簡單使用spa
二、枚舉的構造方法blog
2.一、使用註釋方式說明ip
2.二、使用構造方法開發
2.三、使用帶有構造器的枚舉字符串
三、就這些了?get
3.一、需求 it
3.二、使用Map實現io
3.三、枚舉結合Map
package cn.ganlixin.demo.enums; /** * 描述: 季節枚舉類 */ public enum SeasonEnum { // 枚舉值之間使用逗號隔開,而不是分號 SPRING, SUMMER, AUTUMN, WINNER; }
@Test public void testUseSeasonEnum() { System.out.println(SeasonEnum.AUTUMN); // AUTUMN // 獲取枚舉類中定義的全部枚舉項(每一項都是枚舉,而不是字符串) final SeasonEnum[] values = SeasonEnum.values(); for (SeasonEnum season : values) { System.out.print(season +" "); // SPRING SUMMER AUTUMN WINTER } // 根據傳入的字符串,獲取與字符串同名的枚舉項(若是沒有字符串同名的枚舉項,則會報錯) final SeasonEnum winter = SeasonEnum.valueOf("WINTER"); System.out.println(winter); // WINTER // 枚舉項的比較 System.out.println(SeasonEnum.WINTER == SeasonEnum.WINTER); // true // 字符串不能直接與枚舉進行比較 //System.out.println("WINTER" == SeasonEnum.WINTER); // System.out.println(Objects.equals("WINTER", SeasonEnum.WINTER)); // false }
雖然能夠經過給枚舉項增長註釋的方式來表達枚舉項的含義,可是對於打包發佈後,註釋是刪掉的,這時就很差了
package cn.ganlixin.demo.enums; /** * 描述: 季節枚舉類 */ public enum SeasonEnum { // 枚舉值之間使用逗號隔開,使用註釋的方式說明枚舉項的含義 SPRING, // 春天 SUMMER, // 夏天 AUTUMN, // 秋天 WINTER; // 冬天 }
package cn.ganlixin.demo.enums; /** * 描述: 季節枚舉類 */ public enum SeasonEnum { // 枚舉值定義。枚舉值之間使用逗號隔開,使用構造方法設置 SPRING("春天"), SUMMER("夏天"), AUTUMN("秋天"), WINTER("冬天"); // 枚舉項的說明(好比註釋"春天") String description; // 還能夠本身加其餘字段 // 建立一個構造方法 SeasonEnum(String description) { this.description = description; } // 獲取枚舉項描述 public String getDescription() { return description; } // 通常不建議提供setter,由於枚舉類不該該被改變(包括信息描述) // public void setDescription(String description) { // this.description = description; // } }
須要注意的是,上面SeasonEnum的各部分代碼順序不能更改,也就是說枚舉項定義必須在其餘代碼以前(包括構造方法、屬性、getter)。
@Test public void testSeasonEnumWithConstructor() { System.out.println(SeasonEnum.AUTUMN); // AUTUMN // 每個枚舉項都默認包含name方法,返回枚舉項的字符串類型 System.out.println(SeasonEnum.AUTUMN.name()); // AUTUMN // 調用方法獲取枚舉項的描述 System.out.println(SeasonEnum.AUTUMN.getDescription()); // 秋天 }
看完上面的定義和使用方式,你以爲枚舉就這些了嗎?的確,枚舉就這內容,可是在真實開發工做中,仍是不夠的。
好比,我想根據一個字符串,獲取枚舉類中同名的枚舉項,可是返回的是枚舉項的描述:
僞代碼以下:
String item = "xxx"; // 傳入字符串獲取對應的描述,而不是枚舉項 String desctiption = SeasonEnum.getDescription(item);
一個簡單的方式就是經過使用不可變Map來實現,這裏就不掩飾了
可使用枚舉和Map結合的方式,既保留了枚舉的功能,也可使用Map的功能
package cn.ganlixin.demo.enums; import java.util.HashMap; import java.util.Map; /** * 描述: 季節枚舉類 */ public enum SeasonEnum { // 枚舉值之間使用逗號隔開,使用構造方法設置 SPRING("春天"), SUMMER("夏天"), AUTUMN("秋天"), WINTER("冬天"); // 用來存枚舉項(字符串類型)與description的對應關係 private static final Map<String, String> SeasonEnumMap = new HashMap<>(); static { // 將枚舉項的名稱與描述存入map for (SeasonEnum season : values()) { SeasonEnumMap.put(season.name(), season.getDescription()); } } // 枚舉項的說明(好比註釋"春天") String description; // 建立一個構造方法 SeasonEnum(String description) { this.description = description; } // 獲取枚舉項描述 public String getDescription() { return description; } /** * 根據字符串類型的枚舉項,獲取描述 * @param season * @return */ public static String fromSeasonName(String season) { return SeasonEnumMap.get(season); } }
使用示例
@Test public void testEnumWithMap() { System.out.println(SeasonEnum.fromSeasonName("WINTER")); // 冬天 System.out.println(SeasonEnum.fromSeasonName("NotExists")); // null }