1. 枚举的概述
枚举和Java类一样,也是一种引用数据类型,是jdk5.0中引入的一个新特性,其用于定义一组取值范围比较固定的数据。
例如,可以通过枚举将这些固定数据作为枚举常量来表示:
- 季节:春夏秋冬
- 星期:星期一到星期日
- 月份:一月到十二月
- 支付方式:微信、支付宝、银行卡
- 订单状态:未付款、已付款、已配货、已发货、、退款、已确认
- 线程状态:创建、就绪、运行、阻塞、死亡
- 方向:上下左右
- 颜色:红黄蓝绿
使用枚举的好处:可以提高代码的可读性,增加数据的安全性。
在Java中,所有的枚举类默认继承自java.lang.Enum类,由于Java是单继承的,所以枚举类无法再继承其他类。
如果枚举中只有一个实例,无法通过反射或序列化创建其他实例。
2. Enum类的常用方法
3. 枚举的定义和使用
3.1 在jdk5.0之前,自定义枚举类
package cn.z3inc.constant;
public class ColorTest {
public static void main(String[] args) {
Color blue = Color.BLUE; // 获取枚举类对象
System.out.println(blue); //Color{colorName='蓝色', colorDesc='蓝色的小车'}
System.out.println("colorName:"+blue.getColorName());//colorName:蓝色
System.out.println("colorDesc:"+blue.getColorDesc());//colorDesc:蓝色的小车
}
}
// 自定义枚举类
class Color {
// 1.声明Color对象的属性: private final修饰
private final String colorName;
private final String colorDesc;
// 2.构造器私有化,并给对象属性赋值
private Color(String colorName, String colorDesc) {
this.colorName = colorName;
this.colorDesc = colorDesc;
}
// 3.为当前枚举类提供多个对象(常量): public static final修饰
public static final Color RED = new Color("红色", "红色的小车");
public static final Color GREEN = new Color("绿色", "绿色的小车");
public static final Color BLUE = new Color("蓝色", "蓝色的小车");
// 4.提供getter方法
public String getColorName() {
return colorName;
}
public String getColorDesc() {
return colorDesc;
}
// 5.重写toString方法
@Override
public String toString() {
return "Color{" +
"colorName='" + colorName + '\'' +
", colorDesc='" + colorDesc + '\'' +
'}';
}
}
运行结果:
3.2 在jdk5.0之后,使用enum关键字定义枚举类
(1)枚举类有多个字段的情况:
package cn.z3inc.constant;
public class SeasonTest {
public static void main(String[] args) {
/*
说明: 定义的枚举类默认继承于java.lang.Enum类
如果不提供toString方法,则调用父类Enum的toString方法,输出的是枚举类对象的名字
*/
Season summer = Season.SUMMER;
System.out.println(summer); // 如果不提供toString方法,默认输出的是枚举类对象的名字: SUMMER
System.out.println(Season.class.getSuperclass()); // class java.lang.Enum
test(summer); // 夏日炎炎
}
// 测试方法
public static void test(Season season) {
// jdk5.0之前,switch语句只能支持byte、short、char、int四种基本数据类型,以及枚举类型
// jdk7.0之后,switch语句还可以支持String类型
switch (season) {
case AUTUMN:
System.out.println(Season.AUTUMN.getDesc());
break;
case SPRING:
System.out.println(Season.SPRING.getDesc());
break;
case SUMMER:
System.out.println(Season.SUMMER.getDesc());
break;
case WINTER:
System.out.println(Season.WINTER.getDesc());
break;
}
}
// 使用enum关键字定义枚举类
enum Season {
// 1. 提供当前枚举类的对象,多个对象之间用逗号隔开,末尾对象用分号结束
SPRING("春天", "春暖花开"),
SUMMER("夏天", "夏日炎炎"),
AUTUMN("秋天", "秋高气爽"),
WINTER("冬天", "冬虫夏草");
// 2. 声明Season对象的属性: private final修饰
private final String name; // 季节名称
private final String desc; // 季节描述
// 3. 构造器私有化,并给对象属性赋值: private可以省略
private Season(String name, String desc) {
this.name = name;
this.desc = desc;
}
// 4. 提供getter方法
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
// 5. 根据季节描述获取枚举对象(枚举值)
public static Season getSeason(String desc) {
Season[] values = Season.values();
for (Season value : values) {
if (desc.equals(value.getDesc())) {
return value;
}
}
return null;
}
}
}
运行结果:
通过反编译查看源码:javap Season.class
(2)枚举类没有字段的情况:
public class AnimalTest {
public static void main(String[] args) {
Animal cat = Animal.CAT;
System.out.println(cat); // CAT
Animal pig = Animal.PIG;
System.out.println(pig); // PIG
}
}
enum Animal{
// 枚举类的实例对象(枚举值)
CAT,DOG,PIG,DUCK;
}
4. 使用枚举替代魔法值
存在魔法值的场景:
class Demo1 {
public static void main(String[] args) {
int userType = 1;
if (userType == 1) {
System.out.println("管理员用户");
} else if (userType == 2) {
System.out.println("普通用户");
} else {
System.out.println("未知用户类型");
}
}
}
将常量值抽取到枚举类中使用:
public class Demo1 {
public static void main(String[] args) {
int userType = 1;
if (userType == UserType.ADMIN.getCode()) {
System.out.println(UserType.ADMIN.getDesc());
} else if (userType == UserType.NORMAL.getCode()) {
System.out.println(UserType.NORMAL.getDesc());
} else {
System.out.println(UserType.UNKNOWN.getDesc());
}
}
}
enum UserType {
// 枚举对象(枚举值)
ADMIN(1, "管理员用户"),
NORMAL(2, "普通用户"),
UNKNOWN(3, "未知用户类型");
// 成员变量
private int code;
private String desc;
// 构造方法
UserType(int code, String desc) {
this.code = code;
this.desc = desc;
}
// 根据code获取枚举值
public static UserType of(int code) {
for (UserType userType : UserType.values()) {
if (userType.code == code) {
return userType;
}
}
return UNKNOWN;
}
public int getCode() {
return code;
}
public String getDesc() {
return desc;
}
}
运行结果: