1. 枚举类的定义与特点
定义:
枚举类是一种特殊的类,用于表示一组固定的常量(如方向、状态等)。
核心特点:
- 最终类:默认继承
java.lang.Enum,不可被继承(隐式final)。 - 常量对象:第一行罗列的名称是常量,每个常量对应枚举类的一个实例。
- 私有构造器:构造器强制私有化,禁止外部创建对象。
- 内置方法:编译器自动生成
values()和valueOf()等方法。
代码示例:
public enum Direction {
UP, DOWN, LEFT, RIGHT; // 常量对象
}
编译后等价于:
public final class Direction extends Enum<Direction> {
public static final Direction UP = new Direction();
public static final Direction DOWN = new Direction();
public static final Direction LEFT = new Direction();
public static final Direction RIGHT = new Direction();
// 私有构造器
private Direction() {}
public static Direction[] values() { /*...*/ }
public static Direction valueOf(String name) { /*...*/ }
}
2. 枚举的常用方法
| 方法 | 作用 | 示例 |
|---|---|---|
values() | 返回所有枚举常量数组 | Direction[] dirs = Direction.values() |
valueOf(String name) | 根据名称返回枚举常量 | Direction d = Direction.valueOf("UP") |
ordinal() | 返回常量在枚举中的索引(从0开始) | int index = Direction.UP.ordinal() |
name() | 返回常量名称(与声明一致) | String name = Direction.UP.name() |
3. 枚举的应用场景
3.1 信息分类与标志
- 场景:代替常量类,提高代码可读性和类型安全。
public enum Status {
PENDING, APPROVED, REJECTED; // 审批状态
}
// 使用枚举作为参数类型
public void process(Status status) {
switch (status) {
case PENDING: /* 处理中 */ break;
case APPROVED: /* 已批准 */ break;
case REJECTED: /* 已拒绝 */ break;
}
}
3.2 状态机与流程控制
- 场景:定义有限状态集合,避免非法状态。
public enum TrafficLight {
RED("停止"), YELLOW("等待"), GREEN("通行");
private final String action;
// 带参构造器
private TrafficLight(String action) {
this.action = action;
}
public String getAction() {
return action;
}
}
// 使用示例
TrafficLight light = TrafficLight.RED;
System.out.println(light.getAction()); // 输出:停止
3.3 配置信息管理
- 场景:结合
BigDecimal精确计算,定义舍入模式。
import java.math.BigDecimal;
import java.math.RoundingMode;
public class Calculator {
public static BigDecimal divide(BigDecimal a, BigDecimal b) {
// 使用枚举定义舍入模式
return a.divide(b, 2, RoundingMode.HALF_UP);
}
}
// 调用示例
BigDecimal result = Calculator.divide(
BigDecimal.valueOf(0.1),
BigDecimal.valueOf(0.3)
);
System.out.println(result); // 输出:0.33
4. 枚举的高级用法
4.1 添加自定义方法
- 场景:为枚举常量扩展行为逻辑。
public enum Operation {
ADD {
public double apply(double x, double y) { return x + y; }
},
SUBTRACT {
public double apply(double x, double y) { return x - y; }
};
public abstract double apply(double x, double y);
}
// 使用示例
double result = Operation.ADD.apply(10, 5); // 15.0
4.2 实现接口
- 场景:不同枚举常量实现差异化逻辑。
public interface Command {
void execute();
}
public enum FileOperation implements Command {
OPEN {
public void execute() { System.out.println("打开文件"); }
},
SAVE {
public void execute() { System.out.println("保存文件"); }
};
}
// 调用统一接口
FileOperation.OPEN.execute(); // 输出:打开文件
5. 枚举 vs 常量类
| 对比维度 | 枚举 | 常量类 |
|---|---|---|
| 类型安全 | 强类型,编译时检查 | 字符串/整型常量,易出错 |
| 可读性 | 语义明确(如 Status.PENDING) | 魔法数值(如 int STATUS = 1) |
| 扩展性 | 支持方法、接口、字段 | 仅能定义静态常量 |
| 序列化 | 天然支持序列化,线程安全 | 需手动处理 |
常量类弊端示例:
// 常量类(不推荐)
public class StatusConst {
public static final int PENDING = 0;
public static final int APPROVED = 1;
}
// 易混淆的调用
process(100); // 编译通过,但逻辑错误!
6. 总结
- 核心价值:枚举通过类型安全的方式管理固定集合,替代魔法数值和常量类。
- 适用场景:
- 状态标志(如订单状态、系统配置)。
- 有限选择集合(如方向、颜色)。
- 需要扩展行为的常量(如不同操作的执行逻辑)。
- 最佳实践:
- 优先使用枚举代替常量类。
- 利用构造器和自定义方法增强枚举功能。
- 结合
switch实现状态机逻辑。
4621

被折叠的 条评论
为什么被折叠?



