一直对枚举的知识点和应用场景都不是特别明确,特地花点时间对该知识点进行总结。有不对之处,欢迎指出;前端
枚举是JDK1.5出的新特性。它是一种特殊数据类型,可以为一个变量定义一组预约义的常量。变量必须等于为其预约义的值之一。同时在JDK1.6中switch也支持枚举进行逻辑判断。java
枚举经过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抽象类的构造方法。能够打断点调试下ide
//相似执行了3次
/** *第一个参数为值的名称 *第二个参数为值的序号 **/
new Enum<TestEnum>("RED",0);
new Enum<TestEnum>("GREEN",1);
new Enum<TestEnum>("BLUE",2);
复制代码
二、以上代码我都不知道RED、GREEN、BLUE是干啥的。枚举能够实现相似key:val结构的形式吗?能够的,Java容许咱们在枚举类中添加任意方法,经过该机制,咱们就能够添加所谓的描述了。代码以下:this
/** * 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数据格式;idea
三、带抽象方法的枚举类;例如:按不一样班级不一样学生,分配不一样老师数。A、B、C这3个班。A班学生达到30人,分配2个老师;B班学生达到40人,分配3个老师;C班学生达到50人,分配4个老师;代码实现以下:spa
//枚举文件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
复制代码
四、枚举类不存在继承关系,可是能够实现接口。使用extends实如今idea编辑器就会有报错提示。在枚举类中实现接口,是对枚举类的一种约束。能够自行码下;调试
在这分为Enum类方法和枚举类值方法code
//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:返回此枚举与指定对象是否匹配
}
复制代码