在Java中如何定义枚举类型_Javaenum基础语法解析
发布时间 - 2026-01-04 00:00:00 点击率:次Java枚举必须用enum关键字声明,是继承java.lang.Enum的final类,不可继承或new实例;枚举常量须在最前,自动为public static final实例;可含私有构造方法、字段和方法,带参常量需在无参之前。
Java 枚举必须用 enum 关键字声明,不能用 class 或 interface
Java 枚举是独立的引用类型,语法上必须以 enum 开头,后面紧跟枚举名和花括号。它不是类的变体,也不是接口实现——编译器会自动将其编译为继承 java.lang.Enum 的 final 类,因此你无法手动继承它,也不能用 new 实例化。
常见错误是试图写成 public class Status extends Enum,这会直接编译失败;或者漏掉花括号里的枚举常量,比如只写 enum 而没列值,虽然语法合法但毫无意义。
Color { }
-
enum声明体中,枚举常量必须出现在最前面(可带参数或大括号定义内部类) - 每个枚举常量默认是
public static final的该枚举类型实例 - 枚举类可以有构造方法、字段、普通方法,但构造方法必须是
private(显式或隐式)
枚举常量后跟括号表示调用带参构造方法
当你看到 RED(255, 0, 0) 这样的写法,说明该枚举定义了接受三个 int 参数的私有构造方法。括号里的值会传给构造方法,用于初始化每个常量的实例字段。
不带括号的常量(如 GREEN)会走无参构造;混合写法也允许,比如 RED(255, 0, 0), GREEN, BLUE(0, 0, 255) —— 注意逗号分隔,且所有带参常量必须在无参之前(否则编译报错 Enum constant must be the first statement)。
enum Color {
RED(255, 0, 0),
GREEN(0, 255, 0),
BLUE(0, 0, 255);
private final int r, g, b;
Color(int r, int g, int b) {
this.r = r;
this.g = g;
this.b = b;
}
public int getRGB() {
return (r << 16) | (g << 8) | b;
}
}
不要在 switch 中用 String 代替枚举常量
Java 7+ 支持 switch(String),但如果你已有枚举,就别绕路转成字符串再 switch。这样做不仅丢失类型安全,还会让 case 分支失去编译期检查:新增枚举值时,IDE 不会提示你补全 switch 分支,容易遗漏逻辑。
正确做法是直接 switch 枚举变量本身。JVM 对枚举 switch 有优化(底层转为 tableswitch/lookupswitch),性能不输 if-else,且支持 default 和编译检查。
- 用
switch(color) { case RED: ... case GREEN: ... },而不是switch(color.name()) - 如果真要匹配字符串,优先考虑用枚举的静态工厂方法,比如
Color.fromName("RED"),而非在 switch 里硬编码字符串 - 注意:
name()返回声明时的字面量(如"RED"),而toString()可被重写,不保证一致
序列化时用 name() 而非 toString() 或字段
Java 默认序列化枚举只保存其 name(),反序列化时靠这个名字查回原始常量。这是 JVM 级别的保证,稳定可靠。如果你重写了 toString(),或依赖某个业务字段(如 code 或 desc)做 JSON 序列化,就可能在跨服务或版本升级时出问题。
例如用 Jackson 时,默认行为是序列化为 name 字符串;若改成 @JsonValue 指向某个字段,那前端拿到的就不是标准枚举标识,后续加新值或改字段值都可能破坏兼容性。
- 对外暴露的 API 枚举字段,建议保持
name()语义清晰(如PENDING、PAID) - 需要展示文本时,用单独的方法(如
getLabel())返回,不要覆盖toString() - 数据库存枚举,推荐存
name()或自增序号(用ordinal()要小心——删/调换常量顺序会导致数据错乱)
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解
QQ浏览器网页版登录入口 个人中心在线进入
如何破解联通资金短缺导致的基站建设难题?
Claude怎样写约束型提示词_Claude约束提示词写法【教程】
Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧
深入理解Android中的xmlns:tools属性
如何用5美元大硬盘VPS安全高效搭建个人网站?
Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】
高防服务器如何保障网站安全无虞?
专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?
网页设计与网站制作内容,怎样注册网站?
打造顶配客厅影院,这份100寸电视推荐名单请查收
百度浏览器网页无法复制文字怎么办 百度浏览器复制修复
Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程
Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】
如何在万网利用已有域名快速建站?
如何快速搭建高效香港服务器网站?
Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制
Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】
Laravel如何发送系统通知?(Notification渠道示例)
如何用JavaScript实现文本编辑器_光标和选区怎么处理
大同网页,大同瑞慈医院官网?
海南网站制作公司有哪些,海口网是哪家的?
如何快速上传建站程序避免常见错误?
LinuxCD持续部署教程_自动发布与回滚机制
Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲
Laravel如何实现API资源集合?(Resource Collection教程)
北京专业网站制作设计师招聘,北京白云观官方网站?
如何在景安云服务器上绑定域名并配置虚拟主机?
微信小程序 canvas开发实例及注意事项
谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程
Laravel怎么实现支付功能_Laravel集成支付宝微信支付
Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】
详解阿里云nginx服务器多站点的配置
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程
活动邀请函制作网站有哪些,活动邀请函文案?
如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)
Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤
昵图网官网入口 昵图网素材平台官方入口
个人摄影网站制作流程,摄影爱好者都去什么网站?
Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录
javascript读取文本节点方法小结
Python自动化办公教程_ExcelWordPDF批量处理案例
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
如何在IIS7中新建站点?详细步骤解析
Laravel如何优化应用性能?(缓存和优化命令)
浅述节点的创建及常见功能的实现
如何解决hover在ie6中的兼容性问题
Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】

