Enum是一个特殊的类
Java 中的枚举类型(enum)实际上是一种特殊的类。enum编译后是一个特殊的类(有些类似单例模式)这些实例在声明时就被创建,并在整个应用程序的生命周期中只存在一个实例。
enum 用于定义包含固定数量实例的枚举类型。枚举类型的优势在于它提供了更类型安全、更清晰和更具可读性的方式来表示一组相关的常量。
枚举类的构造函数默认是私有的,这是因为枚举常量在声明时就被创建,而且在整个应用程序的生命周期内,它们的数量是固定的
enum的实现,
public final class MyEnum extends Enum<MyEnum> {
//枚举的实例在编译时静态定义,列举在 enum 关键字中。public static final MyEnum FIRST = new MyEnum("FIRST");public static final MyEnum SECOND = new MyEnum("SECOND");// ...private MyEnum(String name) {// 构造函数的实现}// 其他方法和实现
}MyEnum instance = MyEnum.FIRST;//instance 实际上是指向 MyEnum.FIRST 这个唯一的实例的引用。
枚举常量的成员变量默认是 public static final 的
values(), ordinal() 和 valueOf() 方法
enum 定义的枚举类默认继承了 java.lang.Enum 类,并实现了 java.lang.Serializable 和 java.lang.Comparable 两个接口。
values(), ordinal() 和 valueOf() 方法位于 java.lang.Enum 类中:
- values() 返回枚举类中所有的值。
- ordinal()方法可以找到每个枚举常量的索引,就像数组索引一样。
- valueOf()方法返回指定字符串值的枚举常量。
使用情况
switch使用Enum
JDK1.6之前的switch语句只支持int,char,enum类型,使用枚举,能让我们的代码可读性更强。
enum Signal { GREEN, YELLOW, RED
}
public class TrafficLight { Signal color = Useful , Fun and Inspiring Products; public void change() { switch (color) { case RED: color = Signal.GREEN; break; case YELLOW: color = Useful , Fun and Inspiring Products; break; case GREEN: color = Signal.YELLOW; break; } }
}
异常码Enum
public enum ErrorCode {INVALID_INPUT("1001", "Invalid input"),DATA_NOT_FOUND("2001", "Data not found"),// 其他异常类型...;private final String code;private final String message;ErrorCode(String code, String message) {this.code = code;this.message = message;}public String getCode() {return code;}public String getMessage() {return message;}
}
事件Enum
/*** 状态基类*/
public interface BaseStatus {
}/*** 支付状态机*/
public enum PaymentStatus implements BaseStatus {INIT("INIT", "初始化"),PAYING("PAYING", "支付中"),PAID("PAID", "支付成功"),FAILED("FAILED", "支付失败"),;// 支付状态机内容private static final StateMachine<PaymentStatus, PaymentEvent> STATE_MACHINE = new StateMachine<>();static {// 初始状态STATE_MACHINE.accept(null, PaymentEvent.PAY_CREATE, INIT);// 支付中STATE_MACHINE.accept(INIT, PaymentEvent.PAY_PROCESS, PAYING);// 支付成功STATE_MACHINE.accept(PAYING, PaymentEvent.PAY_SUCCESS, PAID);// 支付失败STATE_MACHINE.accept(PAYING, PaymentEvent.PAY_FAIL, FAILED);}// 状态private final String status;// 描述private final String description;PaymentStatus(String status, String description) {this.status = status;this.description = description;}/*** 通过源状态和事件类型获取目标状态*/public static PaymentStatus getTargetStatus(PaymentStatus sourceStatus, PaymentEvent event) {return STATE_MACHINE.getTargetStatus(sourceStatus, event);}
}