首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >java开发中的枚举多种方式使用示例 java开发中的枚举多种方式使用示例

java开发中的枚举多种方式使用示例 java开发中的枚举多种方式使用示例

原创
作者头像
小焱
发布2025-08-07 13:58:39
发布2025-08-07 13:58:39
57200
代码可运行
举报
文章被收录于专栏:Java开发Java开发
运行总次数:0
代码可运行

Java 枚举的 N 种用法,从基础到进阶示例详解

在 Java 开发中,枚举(Enum)远不止 “定义几个常量” 这么简单。它其实是一种特殊的类,能封装数据、实现接口,甚至处理复杂的业务逻辑。结合多年开发经验,整理了几种最常用的枚举使用场景,附完整示例代码。

一、基础用法:替代常量定义

最经典的场景是用枚举替代public static final常量,让代码更具可读性和类型安全性。

代码语言:javascript
代码运行次数:0
运行
复制
// 传统常量方式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("工作日上班");        }    }}

二、带参数的枚举:封装多维度信息

枚举可以像类一样定义成员变量和构造方法,适合表示包含多属性的常量集合。比如定义订单状态:

代码语言:javascript
代码运行次数:0
运行
复制
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()); // 输出"已支付"    }}

三、枚举实现接口:统一行为规范

枚举可以实现接口,让不同枚举实例拥有各自的实现逻辑,适合处理 “同行为不同实现” 的场景。比如定义支付方式的手续费计算:

代码语言:javascript
代码运行次数:0
运行
复制
// 定义接口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    }}

四、结合 switch 语句:简化分支判断

在 Java 7 + 中,switch 支持直接使用枚举,比判断常量值的代码更清晰。

代码语言:javascript
代码运行次数:0
运行
复制
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;        }    }}

五、枚举集合:EnumSet 与 EnumMap

Java 提供了专门针对枚举的集合类,性能比普通集合更好,且使用更便捷。

代码语言:javascript
代码运行次数:0
运行
复制
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)); // 休息    }}

枚举使用的注意事项

  1. 枚举类型默认继承Enum类,不能再继承其他类(但可以实现接口)
  2. 枚举的构造方法必须是private(默认私有,可不写)
  3. 枚举实例是单例的,可直接用==比较(无需equals)
  4. 序列化枚举时不会创建新实例,保证唯一性

合理使用枚举能让代码更健壮,尤其在定义状态、类型、配置项等场景,远比常量或字符串更可靠。实际开发中建议多尝试带参数的枚举和接口实现,能解决很多复杂业务场景。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Java 枚举的 N 种用法,从基础到进阶示例详解
    • 一、基础用法:替代常量定义
    • 二、带参数的枚举:封装多维度信息
    • 三、枚举实现接口:统一行为规范
    • 四、结合 switch 语句:简化分支判断
    • 五、枚举集合:EnumSet 与 EnumMap
    • 枚举使用的注意事项
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档