一、基本概念
枚举是Java1.5引入的新特性,通过关键字enum来定义枚举类。枚举类是一种特殊类,它和普通类一样可以使用构造器、定义成员变量和方法,也能实现一个或多个接口,但是枚举类不能继承其他类。
二、解决ifelse
随着业务的发展,需求只会越来越复杂,为了考虑各种各样的情况,代码中不可避免的会出现很多的if-else。一旦代码中的if-else过多,就会大大影响其可读性和可维护性。
我们可以使用枚举类解决这个问题;
package day03;
/**
* @author qx
* @date 2023/10/20
* @des 季节枚举
*/
public enum SeasonEnum {
SPRING, SUMMER, AUTUMN, WINTER
}
package day03;
/**
* @author qx
* @date 2023/10/20
* @des 枚举测试
*/
public class EnumTest {
public static void main(String[] args) {
testSwitch(SeasonEnum.AUTUMN);
}
private static void testSwitch(SeasonEnum season) {
switch (season) {
case SPRING:
System.out.println("春天");
break;
case SUMMER:
System.out.println("夏天");
break;
case AUTUMN:
System.out.println("秋天");
break;
case WINTER:
System.out.println("冬天");
break;
}
}
}
三、枚举常用方法
方法名 | 说明 |
values() | 返回枚举实例的数组,该数组中的元素保持在枚举中声明的顺序 |
name() | 返回实例名 |
ordinal() | 返回实例声明时的次序 |
getDeclaringClass() | 返回实例所属的枚举类型 |
equals() | 判断枚举实例是否为同一个对象 |
compareTo() | 比较两个对象的ordinal值 |
四、EnumMap
EnumMap作为枚举的专属集合,由于枚举类型实例的数量相对固定并且有限,所以EnumMap使用数组来存放与枚举类型对应的值,毕竟数组是一段连续的内存空间,根据程序局部性原理,效率会很高。
EnumMap需要传递一个类型信息,即Class对象,通过这个参赛EnumMap就可以根据类型信息初始化内部数据结构。
package day03;
/**
* @author qx
* @date 2023/10/20
* @des 季节枚举
*/
public enum SeasonEnum {
SPRING(0, "春天"), SUMMER(1, "夏天"), AUTUMN(2, "秋天"), WINTER(3, "冬天");
private int code;
private String msg;
SeasonEnum(int code, String msg) {
this.code = code;
this.msg = msg;
}
public String getMsg() {
return msg;
}
public int getCode() {
return code;
}
}
package day03;
/**
* @author qx
* @date 2023/10/26
* @des
*/
public class StudyJava {
private String name;
private SeasonEnum seasonEnum;
public StudyJava(String name, SeasonEnum seasonEnum) {
this.name = name;
this.seasonEnum = seasonEnum;
}
public StudyJava() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public SeasonEnum getSeasonEnum() {
return seasonEnum;
}
public void setSeasonEnum(SeasonEnum seasonEnum) {
this.seasonEnum = seasonEnum;
}
}
package day03;
import java.util.*;
/**
* @author qx
* @date 2023/10/26
* @des HashMap和EnumMap
*/
public class EnumMapDemo {
public static void main(String[] args) {
List<StudyJava> list = new ArrayList<>();
list.add(new StudyJava("春天", SeasonEnum.SPRING));
list.add(new StudyJava("春天1", SeasonEnum.SPRING));
list.add(new StudyJava("夏天", SeasonEnum.SUMMER));
list.add(new StudyJava("秋天", SeasonEnum.AUTUMN));
list.add(new StudyJava("秋天1", SeasonEnum.AUTUMN));
list.add(new StudyJava("冬天", SeasonEnum.WINTER));
Map<SeasonEnum, Integer> map = new HashMap<>();
for (StudyJava studyJava : list) {
SeasonEnum seasonEnum = studyJava.getSeasonEnum();
Integer count = map.get(seasonEnum);
if (count != null) {
map.put(seasonEnum, count + 1);
} else {
map.put(seasonEnum, 1);
}
}
System.out.println(map);
System.out.println("--------------");
// 使用EnumMap
Map<SeasonEnum, Integer> enumMap = new EnumMap<>(SeasonEnum.class);
for (StudyJava studyJava : list) {
SeasonEnum seasonEnum = studyJava.getSeasonEnum();
Integer count = enumMap.get(seasonEnum);
if (count != null) {
enumMap.put(seasonEnum, count + 1);
} else {
enumMap.put(seasonEnum, 1);
}
}
System.out.println(enumMap);
}
}
输出:
{AUTUMN=2, SUMMER=1, SPRING=2, WINTER=1}
--------------
{SPRING=2, SUMMER=1, AUTUMN=2, WINTER=1}