Java进阶之枚举
在Java中,我们通常使用 public static final 变量来定义常量,用来声明一些常用而又不会改变的值。
而在Java5中,又提供了一种更加结构化和安全的方式来定义和使用一组固定的常量,那就是枚举。
什么是枚举?
ava 枚举(Enum)是 Java 5 中引入的一个新特性,它是一种特殊的类,可以包含一组固定的常量。枚举用于表示一组固定的值,如星期、月份、状态等。在 Java 中,枚举使用关键字 enum 定义,可以包含方法和变量,也可以实现接口。
定义枚举
枚举的定义非常简单,使用关键字 enum,后面跟着枚举的名称和大括号包含的枚举值。
例如,定义一个表示星期的枚举:
public enum Weekday {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
美剧的值一般要大写,和常量一样。
使用枚举
使用枚举时,可以直接使用枚举名称调用枚举值。例如,获取星期一的枚举值:
Weekday monday = Weekday.MONDAY;
枚举的原理
枚举实际上是继承自 java.lang.Enum 类的一个特殊类。在编译时期,枚举会被编译成一个final类,该类继承自 java.lang.Enum。
每个枚举值都是一个 public static final 的实例,这些实例是通过静态代码块创建的。
例如,上面的 Weekday 枚举在编译后可能如下:
public final class Weekday extends Enum<Weekday> {
public static final Weekday MONDAY;
public static final Weekday TUESDAY;
public static final Weekday WEDNESDAY;
public static final Weekday THURSDAY;
public static final Weekday FRIDAY;
public static final Weekday SATURDAY;
public static final Weekday SUNDAY;
static {
MONDAY = new Weekday();
TUESDAY = new Weekday();
WEDNESDAY = new Weekday();
THURSDAY = new Weekday();
FRIDAY = new Weekday();
SATURDAY = new Weekday();
SUNDAY = new Weekday();
}
}
由此可见,枚举其实是一个多例模式!
多例模式(Multiton Pattern)是一种设计模式,它扩展了单例模式的概念。
在单例模式中,一个类只有一个实例,并且提供一个全局访问点来获取这个实例。
在多例模式中,一个类可以有多个实例,但是实例的数量是有限的,并且通常也是预先定义好的。
以后学习设计模式的时候再仔细学习!
枚举可以包含方法和变量,这些方法和变量可以在枚举的实例中使用。
例如,给Weekday枚举添加一个获取中文星期名称的方法:
public enum Weekday {
MONDAY("星期一"),
TUESDAY("星期二"),
WEDNESDAY("星期三"),
THURSDAY("星期四"),
FRIDAY("星期五"),
SATURDAY("星期六"),
SUNDAY("星期日");
private String chineseName;
Weekday(String chineseName) {
this.chineseName = chineseName;
}
public String getChineseName() {
return chineseName;
}
}
枚举包含变量和方法时,使用的是有参构造,所以定义的枚举值就必须加上参数。
实现接口枚举可以实现接口,但是不能继承其他类(因为已经继承了 java.lang.Enum 类)。
例如,给 Weekday 枚举实现一个 Describe 接口,用于描述枚举值:
public interface Describe {
String describe();
}
public enum Weekday implements Describe {
MONDAY("星期一"), TUESDAY("星期二"), WEDNESDAY("星期三"), THURSDAY("星期四"), FRIDAY("星期五"), SATURDAY("星期六"), SUNDAY("星期日");
private String chineseName;
Weekday(String chineseName) {
this.chineseName = chineseName;
}
@Override
public String describe() {
return "今天是" + chineseName;
}
}
比如在日常开发中编写一个获取响应状态和提示信息的枚举类:
// 定义接口
public interface ResponseStatusInterface {
int getStatusCode();
String getMessage();
}
// 实现接口的枚举类
public enum ResponseStatus implements ResponseStatusInterface {
SUCCESS(200, "操作成功"),
FAILURE(400, "操作失败"),
UNAUTHORIZED(401, "未授权"),
FORBIDDEN(403, "禁止访问"),
NOT_FOUND(404, "资源未找到"),
INTERNAL_SERVER_ERROR(500, "服务器内部错误");
private final int statusCode;
private final String message;
ResponseStatus(int statusCode, String message) {
this.statusCode = statusCode;
this.message = message;
}
@Override
public int getStatusCode() {
return statusCode;
}
@Override
public String getMessage() {
return message;
}
}
// 使用示例
public class Main {
public static void main(String[] args) {
// 获取一个枚举值
ResponseStatus status = ResponseStatus.SUCCESS;
// 打印状态码和提示信息
System.out.println("Status Code: " + status.getStatusCode());
System.out.println("Message: " + status.getMessage());
}
}
END