Java中枚举知识点总结

564 阅读3分钟

基本概念:

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

枚举是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);
        }  
    }
}
//执行结果
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为例):

在这分为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:返回此枚举与指定对象是否匹配
}