java 中的枚举类


文章目录



模拟一个枚举类

日常我们遇到用一个静态类来定义常量

public class Weekday {
    public static final int SUN = 0;
    public static final int MON = 1;
    public static final int TUE = 2;
    public static final int WED = 3;
    public static final int THU = 4;
    public static final int FRI = 5;
    public static final int SAT = 6;
}

我们如何使用这个静态类?

if(Weekday.SUN==6){
    //逻辑处理
}

java中的enum类

上面定义的类中几个静态变量使用起来很方便,但是有几个明显的缺点:

  • 类型不安全
    因为我们上面定义的 Weekday 类中有7个变量,对应int值范围非常广;
    而使用 enum 类我们可以限定数据的域;
    枚举可以理解为几个常量的集合,数据不太会改变,使用枚举之后语义更加明确,因为数据域不大.

我们定义一个最简单的枚举:

public enum Weekday {
    SUN, MON, TUE, WED, THU, FRI, SAT;
}

关键字enum 来定义;
和 class ,interface 的地位一样;
enum 定义的枚举类默认继承了 java.lang.Enum,而不是继承 Object 类;
枚举类可以实现一个或多个接口,不能再继承其他类;
枚举经过编译器编译出的class大概像这样:

public final class Weekday extends Enum { 
    // 继承自Enum,标记为final class
    // 每个实例均为全局唯一:
    public static final Weekday SUN = new Weekday();
    public static final Weekday MON = new Weekday();
    public static final Weekday TUE = new Weekday();
    public static final Weekday WED = new Weekday();
    public static final Weekday THU = new Weekday();
    public static final Weekday FRI = new Weekday();
    public static final Weekday SAT = new Weekday();
    
    // private构造方法,外部无法调用new来实例化:
    private Color() {}
}

我们可以看到编译后的 enum 类和我们定义的类差不多,
但是我们没有办法通过普通的class 来定义 enum ,必须使用关键词 enum 来定义枚举.

枚举类不需使用 new 关键字,不需显式调用构造器,自动添加 public static final 修饰;
枚举类的构造器只能是私有的;


枚举中定义属性和方法

上面我们看到枚举其实也是一个类,但是不同于我们定义的普通类.
既然是一个类,那我们就可以定义属性和方法.

public  enum Season{

    SPRING("春天","一年之计在于春"),
    SUMMER("夏天","夏天好热 ~ "),
    FALL("秋天","秋水共长天一色"),
    WINTER("冬天","冬天好冷 ~ ");

    // 添加枚举对象的名称
    private final String name;

    // 添加枚举对象的描述
    private final String desc;

    //私有的构造函数
    private Season(String name,String desc){
        this.name = name;
        this.desc = desc;
    }

    //获取Name 属性
    public String getName(){
        return name;
    }

    //获取 Desc 属性
    public String getDesc(){
        return desc;
    }
}

SPRING("春天","一年之计在于春")
我们定义的枚举格式 ( name , desc )
并且定义了属性可以获取 name 和 desc 变量值.
使用的时候:

Season.SPRING.getName()
春天

出自:java 中的枚举类

回到顶部