前言:开发中我们经常需要定义一组常量,这时我们就可以使用枚举类。
注意:使用枚举类有个前提,就是我们这组常量的个数是有限个。例如:星期、四季、性别、支付方式、就职状态、线程装填等。
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);
一般我们会重写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());
}