本文目录导读:

在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)的情况。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播