在 Java 开发中,枚举(Enum)远不止 “定义几个常量” 这么简单。它其实是一种特殊的类,能封装数据、实现接口,甚至处理复杂的业务逻辑。结合多年开发经验,整理了几种最常用的枚举使用场景,附完整示例代码。
最经典的场景是用枚举替代public static final常量,让代码更具可读性和类型安全性。
// 传统常量方式public class Weekday { public static final int MONDAY = 1; public static final int TUESDAY = 2; // ... 其他日期}// 枚举方式(更优)public enum Weekday { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY}// 使用示例public class Test { public static void main(String[] args) { Weekday today = Weekday.MONDAY; if (today == Weekday.SATURDAY || today == Weekday.SUNDAY) { System.out.println("周末休息"); } else { System.out.println("工作日上班"); } }}
枚举可以像类一样定义成员变量和构造方法,适合表示包含多属性的常量集合。比如定义订单状态:
public enum OrderStatus { // 状态码、状态描述 PENDING(100, "待支付"), PAID(200, "已支付"), SHIPPED(300, "已发货"), COMPLETED(400, "已完成"), CANCELLED(500, "已取消"); private final int code; private final String desc; // 构造方法(必须私有) OrderStatus(int code, String desc) { this.code = code; this.desc = desc; } // getter方法 public int getCode() { return code; } public String getDesc() { return desc; } // 常用:根据code获取枚举实例 public static OrderStatus getByCode(int code) { for (OrderStatus status : values()) { if (status.code == code) { return status; } } throw new IllegalArgumentException("无效的订单状态码:" + code); }}// 使用示例public class Test { public static void main(String[] args) { OrderStatus status = OrderStatus.getByCode(200); System.out.println("当前状态:" + status.getDesc()); // 输出"已支付" }}
枚举可以实现接口,让不同枚举实例拥有各自的实现逻辑,适合处理 “同行为不同实现” 的场景。比如定义支付方式的手续费计算:
// 定义接口public interface Payment { BigDecimal calculateFee(BigDecimal amount);}// 枚举实现接口public enum PaymentMethod implements Payment { ALIPAY { @Override public BigDecimal calculateFee(BigDecimal amount) { // 支付宝手续费0.6% return amount.multiply(new BigDecimal("0.006")); } }, WECHAT_PAY { @Override public BigDecimal calculateFee(BigDecimal amount) { // 微信支付手续费0.6%,但满100减0.1 BigDecimal fee = amount.multiply(new BigDecimal("0.006")); return amount.compareTo(new BigDecimal("100")) >= 0 ? fee.subtract(new BigDecimal("0.1")) : fee; } }, BANK_TRANSFER { @Override public BigDecimal calculateFee(BigDecimal amount) { // 银行转账免手续费 return BigDecimal.ZERO; } }}// 使用示例public class Test { public static void main(String[] args) { BigDecimal amount = new BigDecimal("200"); System.out.println("支付宝手续费:" + PaymentMethod.ALIPAY.calculateFee(amount)); // 1.2 System.out.println("微信支付手续费:" + PaymentMethod.WECHAT_PAY.calculateFee(amount)); // 1.1 }}
在 Java 7 + 中,switch 支持直接使用枚举,比判断常量值的代码更清晰。
public enum Season { SPRING, SUMMER, AUTUMN, WINTER}public class Test { public static void main(String[] args) { Season season = Season.SUMMER; switch (season) { case SPRING: System.out.println("春暖花开"); break; case SUMMER: System.out.println("夏日炎炎"); break; case AUTUMN: System.out.println("秋高气爽"); break; case WINTER: System.out.println("冬雪皑皑"); break; } }}
Java 提供了专门针对枚举的集合类,性能比普通集合更好,且使用更便捷。
import java.util.EnumSet;import java.util.EnumMap;public class Test { public static void main(String[] args) { // EnumSet:存储枚举的高性能集合 EnumSet<Weekday> workdays = EnumSet.range(Weekday.MONDAY, Weekday.FRIDAY); System.out.println("工作日:" + workdays); // [MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY] // EnumMap:key为枚举的映射 EnumMap<Weekday, String> schedule = new EnumMap<>(Weekday.class); schedule.put(Weekday.SATURDAY, "逛街"); schedule.put(Weekday.SUNDAY, "休息"); System.out.println("周日安排:" + schedule.get(Weekday.SUNDAY)); // 休息 }}
合理使用枚举能让代码更健壮,尤其在定义状态、类型、配置项等场景,远比常量或字符串更可靠。实际开发中建议多尝试带参数的枚举和接口实现,能解决很多复杂业务场景。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。