基本概念:
一直对枚举的知识点和应用场景都不是特别明确,特意花点时间对该知识点进行总结。有不对之处,欢迎指出;
枚举是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;
}
}
1、简单版,代码如下:
/**
* 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);
}
}
}
以上代码其实执行了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为例):
在这分为Enum类方法和枚举类值方法
//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:返回此枚举与指定对象是否匹配
}