news 2026/4/14 18:33:38

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
枚举类的构造方法 是怎么使用的

枚举的构造方法是干嘛的?我从来没手动 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. 最终效果:让枚举从一个名字,变成一个带业务属性的配置对象
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/14 18:31:21

Tableau Prep实战:如何把12个月的销售分表一键合并,并关联产品信息表?

Tableau Prep实战:12个月销售分表智能合并与产品表关联全流程 电商数据分析师小张最近遇到了一个典型难题——他手头有过去12个月独立的销售数据Excel表,每张表结构相似但列名略有差异,还有一张独立的产品维度表。老板要求他快速整合这些数据…

作者头像 李华
网站建设 2026/4/14 18:30:22

GME-Qwen2-VL-2B-Instruct部署与Node.js环境配置:打造全栈AI应用后端

GME-Qwen2-VL-2B-Instruct部署与Node.js环境配置:打造全栈AI应用后端 如果你已经成功在星图GPU平台上部署了GME-Qwen2-VL-2B-Instruct这个强大的视觉语言模型,那么恭喜你,最核心的AI能力已经就位。但要让这个能力真正为你所用,比…

作者头像 李华
网站建设 2026/4/14 18:30:15

FanControl终极指南:5分钟掌握Windows风扇智能控制技巧

FanControl终极指南:5分钟掌握Windows风扇智能控制技巧 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/f…

作者头像 李华
网站建设 2026/4/14 18:26:33

当GStreamer遇到v4l2:Ubuntu系统USB摄像头开发避坑大全(附常用命令清单)

GStreamer与v4l2深度整合:Ubuntu USB摄像头开发实战指南 在视频应用开发领域,GStreamer框架与v4l2工具链的结合为开发者提供了强大的视频处理能力。本文将深入探讨如何利用这套技术栈解决实际开发中的各类问题,从硬件兼容性验证到性能调优&am…

作者头像 李华