一直对枚举的知识点和应用场景都不是特别明确,特意花点时间对该知识点进行总结。有不对之处,欢迎指出;
枚举是JDK1.5出的新特性。它是一种特殊数据类型,能够为一个变量定义一组预定义的常量。变量必须等于为其预定义的值之一。同时在JDK1.6中switch也支持枚举进行逻辑判断。
枚举通过enum关键字进行定义。默认都是java.lang.Enum(Enum属于抽象类)的子类。同时枚举类型的每个值都会映射到Enum抽象类中的构造方法。源码如下:
public abstract class Enum<E extends Enum<E>> implements Comparable<E>, Serializable { //Enum.java:117-120行 protected Enum(String name, int ordinal) { this.name = name; this.ordinal = ordinal; } } 复制代码
/** * TestEnum.java * TestEnum 声明枚举 * RED,GREEN,BLUE 预定义的常量 **/ public enum TestEnum { RED,GREEN,BLUE; } //TestMain.java class TestMain { public static void main(String[] args){ for(TestEnum test : TestEnum.values()){ System.out.println(test); } } } //执行结果 RED GREEN BLUD 复制代码
以上代码其实执行了3次Enum抽象类的构造方法。可以打断点调试下
//类似执行了3次 /** *第一个参数为值的名称 *第二个参数为值的序号 **/ new Enum<TestEnum>("RED",0); new Enum<TestEnum>("GREEN",1); new Enum<TestEnum>("BLUE",2); 复制代码
2、以上代码我都不知道RED、GREEN、BLUE是干啥的。枚举可以实现类似key:val结构的形式吗?可以的,Java允许我们在枚举类中添加任意方法,通过该机制,我们就可以添加所谓的描述了。代码如下:
/** * TestEnum.java * TestEnum 声明枚举 * RED,GREEN,BLUE 预定义的常量 **/ public enum TestEnum { RED("red","红色"),GREEN("green","绿色"),BLUE("blue","蓝色"); private String code; private String desc; TestEnum(String code,String desc){ this.code=code; this.desc=desc; } public String getCode(){ return code; } public void setCode(String code){ this.code=code; } public String getDesc(){ return desc; } public void setDesc(String desc){ this.desc=desc; } public static HashMap toMap(){ //枚举转成Map(前端的JSON) HashMap map=new HashMap(); for(TestEnum test:TestEnum.values()){ map.put(test.getCode(),test.getDesc()); } return map; } } //TestMain.java class TestMain { public static void main(String[] args){ for(TestEnum test : TestEnum.values()){ System.out.println(test.getDesc()); } } } //执行结果 红色 绿色 蓝色 复制代码
以上方式可以用来做HTTP请求响应返回JSON数据格式;
3、带抽象方法的枚举类;例如:按不同班级不同学生,分配不同老师数。A、B、C这3个班。A班学生达到30人,分配2个老师;B班学生达到40人,分配3个老师;C班学生达到50人,分配4个老师;代码实现如下:
//枚举文件TeacherNumEnum.java public enum TeacherNumEnum{ A("30人") { public int distribute(){ return 2; } }; B("40人") { public int distribute(){ return 3; } }; C("50人") { public int distribute(){ return 4; } }; private String desc; //人数描述 TaskTypeEnum(String desc){ this.desc=desc; } public String getDesc(){ return desc; } public abstract int distribute(); } //TestMain.java class TestMain { public static void main(String[] args){ for(TeacherNumEnum task : TeacherNumEnum.values()){ System.out.println(task.getDesc()+";分配老师人数:"+task.distribute()); } } } //执行结果 30人;分配老师人数:2 40人;分配老师人数:3 50人;分配老师人数:4 复制代码
4、枚举类不存在继承关系,但是可以实现接口。使用extends实现在idea编辑器就会有报错提示。在枚举类中实现接口,是对枚举类的一种约束。可以自行码下;
//Enum类方法总结: TeacherNumEnum.values()://Enum[]://返回Enum数组,所以for可以循环 TeacherNumEnum.valueof("枚举值"); //Enum:返回相应的枚举值 //Enum类值方法总结: for(TeacherNumEnum task : TeacherNumEnum.values()){ task.ordinal(); //int:返回枚举值相应的序号 task.name(); //String:返回枚举值名称 task.toString(); //String:返回枚举值名称字符串 task.compareTo(E o); //int:返回此枚举与指定对象的顺序 task.equals(E o); //boolean:返回此枚举与指定对象是否匹配 } 复制代码