枚举类的构造方法 是怎么使用的

枚举的构造方法是干嘛的?我从来没手动 new 过枚举,为什么要写构造方法?


一、先破误区:枚举构造方法,绝对不是给你手动调用的!

先看一段我们项目中常见的枚举构造方法:

// 微信消息模板枚举
WechatNotifyTemplateEnum(String code, String desc, String templateId) {
    this.code = code;
    this.desc = desc;
    this.templateId = templateId;
}

绝对错误的理解:在业务代码里 new WechatNotifyTemplateEnum(...) 手动调用构造方法。

正确的真相

  1. Java 不允许手动实例化枚举(语法直接禁止);
  2. 这个构造方法,是给枚举常量自动调用的;
  3. 执行时机:枚举类第一次被加载时,自动执行。

二、核心作用:给枚举常量「绑定属性」

普通的枚举,只能定义一个名字:

// 光秃秃的枚举,只有名字,没有任何业务属性
public enum WechatNotifyTemplateEnum {
    SEND_NOTICE,
    PICKUP_NOTICE
}

这种枚举只能用来做判断,无法携带业务数据:比如我们需要知道:寄件提醒的编码、描述、微信模板 ID,完全拿不到。

枚举构造方法的核心意义把每一个枚举常量,从一个光秃秃的名称,初始化成一个带完整属性的业务对象。


三、实战写法:带属性的枚举完整版

这是我们小程序 / 微信支付中最常用的消息模板枚举,也是标准写法:

/**
 * 微信订阅消息模板枚举
 */
public enum WechatNotifyTemplateEnum {

    // 1. 枚举常量:自动调用构造方法,传入参数
    /** 寄件提醒 */
    SEND_NOTICE("SEND_NOTICE", "寄件提醒", "template_123456"),
    /** 取件提醒 */
    PICKUP_NOTICE("PICKUP_NOTICE", "取件提醒", "template_789012");

    // 2. 枚举的属性(固定业务数据)
    private final String code;      // 模板编码
    private final String desc;      // 模板描述
    private final String templateId;// 微信官方模板ID

    // 3. 枚举构造方法:私有,自动调用
    WechatNotifyTemplateEnum(String code, String desc, String templateId) {
        this.code = code;
        this.desc = desc;
        this.templateId = templateId;
    }

    // 4. 提供getter,业务代码获取属性
    public String getCode() {
        return code;
    }

    public String getDesc() {
        return desc;
    }

    public String getTemplateId() {
        return templateId;
    }
}

四、底层原理:枚举常量等价于自动 new 对象

写的这行代码:

SEND_NOTICE("SEND_NOTICE", "寄件提醒", "template_123456")

底层等价于

// 类加载时,自动创建枚举常量对象
public static final WechatNotifyTemplateEnum SEND_NOTICE = 
    new WechatNotifyTemplateEnum("SEND_NOTICE", "寄件提醒", "template_123456");

关键执行规则:

  1. 枚举类第一次被使用时,加载并初始化所有常量;
  2. 每个常量只调用一次构造方法
  3. 构造方法默认是 private(即使不写,编译器也会自动加);
  4. 全程无需手动干预。

五、业务代码怎么用?直接获取属性!

枚举初始化完成后,我们在业务中(比如微信发送模板消息),直接通过枚举常量获取属性

public void sendWechatNotice() {
    // 1. 获取寄件提醒的微信模板ID
    String templateId = WechatNotifyTemplateEnum.SEND_NOTICE.getTemplateId();
    
    // 2. 获取编码/描述
    String code = WechatNotifyTemplateEnum.SEND_NOTICE.getCode();
    String desc = WechatNotifyTemplateEnum.SEND_NOTICE.getDesc();

    // 3. 调用微信接口发送消息
    System.out.println("使用模板ID:" + templateId + " 发送消息");
}

一行代码就能拿到固定配置,不用硬编码、不用写 if-else


六、为什么要这么设计?3 大核心优势

这种带属性的枚举设计,是企业级开发的标准规范,优势非常明显:

1. 集中管理固定配置

像微信模板 ID、状态码、类型映射这种固定不变的业务数据,全部写在枚举里,统一维护。

2. 代码优雅,杜绝硬编码

不用在代码里到处写 "template_123456",后期修改模板 ID,只改枚举,不用动业务代码

3. 类型安全,避免出错

用枚举代替字符串 / 数字,编译期就会校验错误,杜绝传错参数的问题。


七、一句话终极总结

  1. 枚举构造方法 = 自动初始化工具,不是给手动调用的;
  2. 枚举常量 (参数 1, 参数 2, 参数 3) = 自动调用构造方法,给常量绑定属性;
  3. 执行时机:枚举类第一次加载时,每个常量初始化一次;
  4. 最终效果:让枚举从一个名字,变成一个带业务属性的配置对象
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值