Java中枚举知识点总结

基本概念:

一直对枚举的知识点和应用场景都不是特别明确,特地花点时间对该知识点进行总结。有不对之处,欢迎指出;前端

枚举是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枚举类方法总结(TeacherNumEnum为例):

在这分为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:返回此枚举与指定对象是否匹配
}
复制代码
相关文章
相关标签/搜索