前言:开发中我们经常需要定义一组常量,这时我们就可以使用枚举类。
注意:使用枚举类有个前提,就是我们这组常量的个数是有限个。例如:星期、四季、性别、支付方式、就职状态、线程装填等。

JDK1.5之前我们需要自定义枚举类,JDK1.5新增enum关键字。

1. 如何自定义枚举类呢?并不难,需要注意一下几个点:
  • 1)枚举对象的属性不允许别改动,所以应该使用private final关键字。
  • 2)枚举类中使用private final 修饰的属性应当在构造器中赋值。
  • 3)若枚举类显示定义了带参构造器,则在列举枚举值时也必须传入对应的参数。
代码举例:
/**
 * 不使用enum关键字
 */
public class CusDefEnumDemo01 {

    // 定义私有化不可变属性
    private final String SEASONNAME; // 季节的名称
    private final String SEASONDESC; // 季节的描述

    // 私有化构造器
    private CusDefEnumDemo01(String seasonname, String seasondesc) {
        SEASONNAME = seasonname;
        SEASONDESC = seasondesc;
    }

    // 定义类对象
    public static final CusDefEnumDemo01 SPRING = new CusDefEnumDemo01("春天",
            "春暖花开");
    public static final CusDefEnumDemo01 SUMMER = new CusDefEnumDemo01("夏天",
            "烈日炎炎");
}
2. 使用enum关键字创建枚举类
2.1 说明
  • 1)使用 enum 定义的枚举类默认继承了 java.lang.Enum类,因此不能再继承其他类。
  • 2)枚举类的构造器只能使用 private 权限修饰符。
  • 3)枚举类的所有实例必须在枚举类中显式列出(, 分隔 ; 结尾)。列出的实例系统会自动添加 public static final 修饰。
  • 4)必须在枚举类的第一行声明枚举类对象。
2.2 代码举例
/**
 * 使用enum关键字创建枚举类
 */
enum SeasonEnum {
    SPRING("春天", "春意盎然"),
    SUMMER("夏天", "烈日炎炎");

    // 实例对象属性
    private String name;
    private String desc;

    private SeasonEnum(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }

    // 定义私有属性的get和set方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }
}
3. 常用方法
  • 1)valueOf()方法:获取对应的枚举常量对象。
// 它有两种传参方式
// 1. 创建枚举类型的Class对象和枚举常量的name
SeasonEnum.valueOf(SeasonEnum.class, "SPRING");
// 2. 直接传入枚举常量的name
SeasonEnum.valueOf("SPRING");

// 如果你传入的枚举常量的name在枚举类中不存在会报IllegalArgumentException。
// 这两种方式都会得到SPRING枚举常量对象,而且是一样的。所以我们一般使用第二种方式来获取枚举常量对象。
  • 2)toString()方法:返回当前枚举常量的常量名。
SeasonEnum spring = SeasonEnum.valueOf("SPRING");
System.out.println(spring);
SeasonEnum summer = SeasonEnum.valueOf("SUMMER");
System.out.println(summer);

Enum java 枚举继承 java枚举类型enum用法_Enum java 枚举继承


一般我们会重写toString方法以获得更多信息,重写方式如下:

// Switch结构中,枚举对象可以直接作为表达式来使用,不需要添加枚举类作为限定
@Override
public String toString() {
    switch (this) {
        case SPRING:
            return SPRING.getName() + "\t" + SPRING.getDesc();
        case SUMMER:
            return SUMMER.getName() + "\t" + SUMMER.getDesc();
        default:
            return "unknow enum obj";
    }
}
  • 3)values() 方法:返回枚举类型的对象数组。该方法可以很方便地遍历所有枚举值。
// 获取枚举类型的对象数组,并遍历打印name属性
SeasonEnum[] values = SeasonEnum.values();
for (SeasonEnum value : values) {
	System.out.println(value.getName());
}

Enum java 枚举继承 java枚举类型enum用法_构造器_02