本文目录导读:

在Java中,自定义枚举属性通常是指在枚举常量中添加字段、构造函数和方法,以下是几种常见的实现方式:
基本属性自定义
public enum Weekday {
MONDAY("星期一", 1),
TUESDAY("星期二", 2),
WEDNESDAY("星期三", 3),
THURSDAY("星期四", 4),
FRIDAY("星期五", 5),
SATURDAY("星期六", 6),
SUNDAY("星期日", 7);
// 自定义属性
private final String chineseName;
private final int value;
// 构造函数
Weekday(String chineseName, int value) {
this.chineseName = chineseName;
this.value = value;
}
// Getter方法
public String getChineseName() {
return chineseName;
}
public int getValue() {
return value;
}
}
使用示例
public class EnumDemo {
public static void main(String[] args) {
// 获取枚举常量
Weekday today = Weekday.MONDAY;
// 访问自定义属性
System.out.println("英文名: " + today.name()); // MONDAY
System.out.println("中文名: " + today.getChineseName()); // 星期一
System.out.println("数值: " + today.getValue()); // 1
// 遍历所有枚举
for (Weekday day : Weekday.values()) {
System.out.println(day.name() + " - " + day.getChineseName());
}
// 根据值查找枚举
Weekday found = getByValue(3);
System.out.println("数值3对应: " + found.getChineseName()); // 星期三
}
// 根据value查找枚举
public static Weekday getByValue(int value) {
for (Weekday day : Weekday.values()) {
if (day.getValue() == value) {
return day;
}
}
return null;
}
}
更复杂的实例 - 订单状态枚举
public enum OrderStatus {
PENDING("待处理", 0, "订单已创建,等待处理"),
PROCESSING("处理中", 1, "订单正在处理"),
SHIPPED("已发货", 2, "订单已发货,等待签收"),
DELIVERED("已签收", 3, "订单已完成签收"),
CANCELLED("已取消", -1, "订单已取消");
private final String displayName;
private final int code;
private final String description;
OrderStatus(String displayName, int code, String description) {
this.displayName = displayName;
this.code = code;
this.description = description;
}
// 获取所有属性
public String getDisplayName() { return displayName; }
public int getCode() { return code; }
public String getDescription() { return description; }
// 根据code获取枚举
public static OrderStatus fromCode(int code) {
for (OrderStatus status : OrderStatus.values()) {
if (status.code == code) {
return status;
}
}
throw new IllegalArgumentException("Invalid code: " + code);
}
// 判断是否可以取消
public boolean canCancel() {
return this == PENDING || this == PROCESSING;
}
// 判断是否是最终状态
public boolean isFinalStatus() {
return this == DELIVERED || this == CANCELLED;
}
}
含抽象方法的枚举
public enum Operation {
ADD("+") {
@Override
public double apply(double x, double y) {
return x + y;
}
},
SUBTRACT("-") {
@Override
public double apply(double x, double y) {
return x - y;
}
},
MULTIPLY("*") {
@Override
public double apply(double x, double y) {
return x * y;
}
},
DIVIDE("/") {
@Override
public double apply(double x, double y) {
if (y == 0) {
throw new ArithmeticException("除数不能为0");
}
return x / y;
}
};
private final String symbol;
Operation(String symbol) {
this.symbol = symbol;
}
public String getSymbol() {
return symbol;
}
// 抽象方法,每个枚举常量必须实现
public abstract double apply(double x, double y);
}
使用接口实现多态
// 定义接口
interface Action {
void execute();
}
// 枚举实现接口
public enum Command implements Action {
START("开始") {
@Override
public void execute() {
System.out.println("执行开始操作...");
}
},
STOP("停止") {
@Override
public void execute() {
System.out.println("执行停止操作...");
}
},
PAUSE("暂停") {
@Override
public void execute() {
System.out.println("执行暂停操作...");
}
};
private final String displayName;
Command(String displayName) {
this.displayName = displayName;
}
public String getDisplayName() {
return displayName;
}
}
测试代码
public class EnumTest {
public static void main(String[] args) {
// 测试订单状态
OrderStatus status = OrderStatus.PROCESSING;
System.out.println("状态: " + status.getDisplayName());
System.out.println("状态码: " + status.getCode());
System.out.println("描述: " + status.getDescription());
System.out.println("是否可以取消: " + status.canCancel());
// 测试操作枚举
Operation op = Operation.ADD;
System.out.println("\n" + 10 + " " + op.getSymbol() + " " + 5 + " = " + op.apply(10, 5));
// 测试命令枚举
Command cmd = Command.START;
System.out.println("\n执行命令: " + cmd.getDisplayName());
cmd.execute();
}
}
最佳实践建议
- 属性声明为 final:枚举属性通常是不可变的,声明为
final - 使用私有构造函數:避免外部创建枚举实例
- 提供合适的查找方法:如
fromCode()、getByValue()等 - 考虑使用抽象方法:当枚举常量需要不同行为时
- 实现接口:增强枚举的灵活性和可扩展性
自定义枚举属性可以使代码更清晰、类型安全,并减少使用魔法值(magic numbers/strings)的情况。