更好的阅读体验:点这里 ( www.doubibiji.com
)
更好的阅读体验:点这里 ( www.doubibiji.com
)
更好的阅读体验:点这里 ( www.doubibiji.com
)
8 枚举类
Java中的枚举(Enum)是一种特殊的类,如果有固定数量的一组常量,那么可以使用枚举来定义。
例如定义季节,一年有四个季节、定义订单的状态、定义性别等,这些数据都是有限的常量,所以推荐使用枚举来定义。
8.1 枚举的定义
枚举使用 enum
关键字来定义。
举个栗子,使用枚举定义四季:
package com.doubibiji;
/**
* 定义枚举
*/
enum Season {
SPRING,
SUMMER,
AUTUMN,
WINTER
}
/**
* 测试类
*/
public class EnumTest {
public static void main(String[] args) {
Season season = Season.SPRING;
System.out.println(season); // SPRING
// 获取父类
System.out.println(Season.class.getSuperclass()); // 父类是:class java.lang.Enum
}
}
枚举也是一种类,而且其中定义的常量就是这个类的实例对象。枚举类因为是类,建议使用驼峰规则,其中的常量使用大写。
使用的时候 Season.SPRING
就是对象,赋值给 Season
类型的变量。
8.2 定义属性
因为枚举是类,所以枚举中也是可以定义属性的,而且可以有构造方法。
举个栗子:
/**
* 定义枚举
*/
enum StatusCode {
USERNAME_EXIST(1000, "用户名已存在"),
ACCOUNT_ERROR(1001, "用户名或密码错误"),
PARAMETER_ERROR(1002, "参数为空"),
ILLEGAL_OPERATION(1003, "非法操作");
private int code;
private String message;
StatusCode(int code, String message) {
this.code = code;
this.message = message;
}
public int getCode() {
return code;
}
public String getMessage() {
return message;
}
}
/**
* 测试类
*/
public class EnumTest {
public static void main(String[] args) {
StatusCode statusCode = StatusCode.ACCOUNT_ERROR;
System.out.println(statusCode); // ACCOUNT_ERROR
System.out.println(statusCode.getCode()); // 1001
System.out.println(statusCode.getMessage()); // 用户名或密码错误
}
}
首先定义了 StatusCode 枚举类,并定了两个属性 code
和 message
、构造方法、getter方法。
构造方法接收两个参数,所以可以在枚举类中定义枚举的常量,并通过构造方法传递两个参数,上面定义了四个枚举常量,实际就是枚举类的四个实例对象。使用的时候,就可以通过实例对象来获取对象中的属性信息了。
8.3 常用的方法
下面介绍一下枚举类常用的方法。
主要就是枚举值获取实例名称、获取属性、通过名称获取实例等方式的介绍:
/**
* 定义枚举
*/
enum StatusCode {
USERNAME_EXIST(1000, "用户名已存在"),
ACCOUNT_ERROR(1001, "用户名或密码错误"),
PARAMETER_ERROR(1002, "参数为空"),
ILLEGAL_OPERATION(1003, "非法操作");
private int code;
private String message;
StatusCode(int code, String message) {
this.code = code;
this.message = message;
}
public int getCode() {
return code;
}
public String getMessage() {
return message;
}
}
/**
* 测试类
*/
public class EnumTest {
public static void main(String[] args) {
StatusCode statusCode = StatusCode.ACCOUNT_ERROR;
// 调用的就是对象的toString()方法
System.out.println(statusCode); // ACCOUNT_ERROR
// 获取枚举常量名称,和toString()结果一样
System.out.println(statusCode.name()); // ACCOUNT_ERROR
// 得到枚举类中所有的常量实例
StatusCode[] statusCodes = StatusCode.values();
for (StatusCode sc : statusCodes) {
System.out.println(sc);
}
// 通过名称获取枚举实例,获取不到会抛出异常IllegalArgumentException
StatusCode parameterError = StatusCode.valueOf("PARAMETER_ERROR");
System.out.println(parameterError.getCode() + ":" + parameterError.getMessage());
// 获取枚举实例在所有枚举值中的index,从0开始
System.out.println(parameterError.ordinal()); // 2
}
}
8.4 枚举类实现接口
枚举类是类,还可以实现接口。
举个栗子,其实也没什么好说的,就是实现接口,实现方法:
interface Info {
void show();
}
/**
* 定义枚举
*/
enum StatusCode implements Info {
USERNAME_EXIST(1000, "用户名已存在"),
ACCOUNT_ERROR(1001, "用户名或密码错误"),
PARAMETER_ERROR(1002, "参数为空"),
ILLEGAL_OPERATION(1003, "非法操作");
private int code;
private String message;
StatusCode(int code, String message) {
this.code = code;
this.message = message;
}
public int getCode() {
return code;
}
public String getMessage() {
return message;
}
@Override
public void show() {
System.out.println(this.code + ":" + this.getMessage());
}
}
/**
* 测试类
*/
public class EnumTest {
public static void main(String[] args) {
StatusCode usernameExist = StatusCode.USERNAME_EXIST;
usernameExist.show(); // 1000:用户名已存在
StatusCode accountError = StatusCode.ACCOUNT_ERROR;
accountError.show(); // 1001:用户名或密码错误
}
}
上面的代码老生常谈,没什么特别的。
其实要说的是每个实例对象可以单独实现接口中的方法。
举个栗子:
interface Info {
void show();
}
/**
* 定义枚举
*/
enum StatusCode implements Info {
USERNAME_EXIST(1000, "用户名已存在") {
@Override
public void show() {
System.out.println("赶紧注册一个用户, " + this.getCode() + ":" + this.getMessage());
}
},
ACCOUNT_ERROR(1001, "用户名或密码错误") {
@Override
public void show() {
System.out.println("密码改完就忘, " + this.getCode() + ":" + this.getMessage());
}
},
PARAMETER_ERROR(1002, "参数为空"),
ILLEGAL_OPERATION(1003, "非法操作");
private int code;
private String message;
StatusCode(int code, String message) {
this.code = code;
this.message = message;
}
public int getCode() {
return code;
}
public String getMessage() {
return message;
}
@Override
public void show() {
System.out.println(this.code + ":" + this.getMessage());
}
}
/**
* 测试类
*/
public class EnumTest {
public static void main(String[] args) {
StatusCode usernameExist = StatusCode.USERNAME_EXIST;
usernameExist.show(); // 赶紧注册一个用户, 1000:用户名已存在
StatusCode accountError = StatusCode.ACCOUNT_ERROR;
accountError.show(); // 密码改完就忘, 1001:用户名或密码错误
}
}
针对每个枚举实例对象,可以单独实现接口中的方法。
这样操作有什么作用呢,我也没有发现,了解一下得了。