目录
1、枚举基础
1.1、创建枚举最简单的方式
1.2、简单使用
2、枚举的构造方法
2.1、使用注释方式说明
2.2、使用构造方法
2.3、使用带有构造器的枚举
3、就这些了?
3.1、需求
3.2、使用Map实现
3.3、枚举结合Map
1、枚举基础
1.1、创建枚举最简单的方式
package cn.ganlixin.demo.enums; /** * 描述: 季节枚举类 */ public enum SeasonEnum { // 枚举值之间使用逗号隔开,而不是分号 SPRING, SUMMER, AUTUMN, WINNER; }
1.2、简单使用
@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 }
2、枚举的构造方法
2.1、使用注释方式说明
虽然可以通过给枚举项增加注释的方式来表达枚举项的含义,但是对于打包发布后,注释是删掉的,这时就不好了
package cn.ganlixin.demo.enums; /** * 描述: 季节枚举类 */ public enum SeasonEnum { // 枚举值之间使用逗号隔开,使用注释的方式说明枚举项的含义 SPRING, // 春天 SUMMER, // 夏天 AUTUMN, // 秋天 WINTER; // 冬天 }
2.2、使用构造方法
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)。
2.3、使用带有构造器的枚举
@Test public void testSeasonEnumWithConstructor() { System.out.println(SeasonEnum.AUTUMN); // AUTUMN // 每一个枚举项都默认包含name方法,返回枚举项的字符串类型 System.out.println(SeasonEnum.AUTUMN.name()); // AUTUMN // 调用方法获取枚举项的描述 System.out.println(SeasonEnum.AUTUMN.getDescription()); // 秋天 }
3、就这些了?
看完上面的定义和使用方式,你觉得枚举就这些了吗?的确,枚举就这内容,但是在真实开发工作中,还是不够的。
3.1、需求1
比如,我想根据一个字符串,获取枚举类中同名的枚举项,但是返回的是枚举项的描述:
伪代码如下:
String item = "xxx"; // 传入字符串获取对应的描述,而不是枚举项 String desctiption = SeasonEnum.getDescription(item);
3.2、使用Map实现
一个简单的方式就是通过使用不可变Map来实现,这里就不掩饰了
3.3、枚举结合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 }