当前位置: 首页 > news >正文

重新认识枚举enum

定义

在 Java 中,enum(枚举)是一种特殊的类,用于定义固定数量的常量集合。它从 JDK 5(Java 1.5) 开始引入,目的是替代传统的 public static final int 常量,提供类型安全、可读性强、功能丰富的常量管理方式

publicenumDay{MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY;}

扩展

publicenumDay{MONDAY("MONDAY",0),TUESDAY("TUESDAY",1);}

相当于

publicfinalclassDayextendsjava.lang.Enum<Day>{publicstaticfinalDayMONDAY=newDay("MONDAY",0);publicstaticfinalDayTUESDAY=newDay("TUESDAY",1);// ... 其他常量privateDay(Stringname,intordinal){super(name,ordinal);}publicstaticDay[]values(){/* 返回所有常量 */}publicstaticDayvalueOf(Stringname){/* 根据名字返回常量 */}}

内置常用方法

方法作用示例
values()返回所有常量数组Day[] days = Day.values();
valueOf(String)根据名称返回常量Day d = Day.valueOf("MONDAY");
ordinal()返回声明索引Day.MONDAY.ordinal() → 0
name()返回常量名称Day.MONDAY.name() → "MONDAY"
compareTo()按声明顺序比较MONDAY.compareTo(TUESDAY) → -1

在 Java 中,枚举类(enum)的构造函数参数数量没有硬性限制

publicenumPlanet{EARTH(1,"blue",9.8,true,"Solar System",...);// 理论上可继续添加Planet(doublemass,Stringcolor,doublegravity,booleanhabitable,Stringsystem/*, ...*/){// 构造逻辑}}
问题说明
代码可读性崩溃超过 5-10 个参数已难以维护(违反 Clean Code 原则)
编译错误某些 IDE 或编译器可能提前报错(如 Eclipse 限制方法参数 ≤ 255,但实际更早失败)
字节码膨胀大量参数导致.class文件臃肿

添加字段,构造方法等

在 Java 中,enum(枚举)不仅可定义常量列表,还可以像普通类一样:

  • 添加字段(成员变量)
  • 定义构造函数
  • 声明方法(包括抽象方法)
  • 实现接口
    这使得 enum 非常强大,适用于需要为每个常量附加数据或行为的场景。
publicenumPlanet{// 枚举常量(必须在最前面,调用构造函数)MERCURY(3.303e+23,2.4397e6),VENUS(4.869e+24,6.0518e6),EARTH(5.976e+24,6.37814e6),MARS(6.421e+23,3.3972e6);// 字段(通常为 private final)privatefinaldoublemass;// 质量(kg)privatefinaldoubleradius;// 半径(m)// 构造函数(只能是 private 或 package-private,默认 private)Planet(doublemass,doubleradius){this.mass=mass;this.radius=radius;}// 方法publicdoublegetMass(){returnmass;}publicdoublegetRadius(){returnradius;}// 计算表面重力:g = G * M / r^2publicdoublesurfaceGravity(){return6.67300E-11*mass/(radius*radius);}// 计算某物体在该星球上的重量publicdoublesurfaceWeight(doubleotherMass){returnotherMass*surfaceGravity();}}
publicclassMain{publicstaticvoidmain(String[]args){Planetearth=Planet.EARTH;System.out.println("Earth's gravity: "+earth.surfaceGravity());System.out.println("My weight on Mars: "+Planet.MARS.surfaceWeight(70));// 70kg 人在火星的重量}}

内置常用方法

高级用法:每个常量有不同行为(抽象方法)

publicenumOperation{PLUS{publicdoubleapply(doublex,doubley){returnx+y;}},MINUS{publicdoubleapply(doublex,doubley){returnx-y;}},TIMES{publicdoubleapply(doublex,doubley){returnx*y;}},DIVIDE{publicdoubleapply(doublex,doubley){returnx/y;}};// 抽象方法 → 每个常量必须实现publicabstractdoubleapply(doublex,doubley);}
doubleresult=Operation.PLUS.apply(5,3);// 8.0
特性说明
枚举常量必须在第一行所有CONSTANT(...)必须出现在字段/方法之前
构造函数只能是private不能publicprotected(防止外部 new)
字段建议用final枚举常量通常是不可变的
可以实现接口enum MyEnum implements Runnable { ... }
不能继承其他类因为enum隐式继承java.lang.Enum(Java 不支持多继承)
可以有静态方法/字段values(),valueOf(String)是自动生成的

总结

Java 的 enum 远不止是“常量集合”,它是一个功能完整的类,支持:
字段 + 构造函数 + 方法 + 接口 + 多态行为
合理使用能让代码更安全、清晰、可维护,是 Java 中被低估的强大特性。

http://www.jsqmd.com/news/1137043/

相关文章:

  • 5分钟精通Midscene:零代码实现全平台UI自动化的终极指南
  • CodexGuide学习路线图:从新手到专家的完整成长路径
  • OpenCV 4.8 灰度变换实战:4种算法对比,提升低照度图像细节 30%
  • 群体智能三大算法:ACO、PSO与ABC的Python工程实现
  • 如何深度优化Dash节点性能:4大内存管理与容量调优策略解析
  • ImageSharp内存映射技术:突破大图像处理瓶颈的零拷贝架构方案
  • Translumo:Windows平台终极实时屏幕翻译神器,打破语言障碍的完整解决方案
  • redis-lua错误处理与调试技巧:解决常见连接和操作问题的完整方案
  • FutureKit多平台支持:iOS、tvOS、watchOS与macOS跨平台开发指南
  • Flutter复杂滚动场景的完整解决方案:PullToRefresh与NestedScrollView的深度集成与性能优化
  • IS31FL3731与PIC18F86K90的LED矩阵控制方案详解
  • deepTools安全最佳实践:保护敏感测序数据的方法
  • PinePods移动版使用指南:Android Auto支持与离线收听技巧
  • 终极Hexo主题Keep完整指南:如何快速构建专注写作的现代化博客
  • 界面控件DevExpress WPF中文教程:Data Grid——卡片视图概述
  • Si5351A高精度时钟发生器在电子系统中的应用与实现
  • Xenia Manager翻译贡献指南:如何为多语言支持添砖加瓦
  • 立式卷板机结构设计
  • 猫抓浏览器资源嗅探扩展:轻松捕获网页视频音频的终极指南
  • 5分钟快速上手react-redux-toastr:为React应用添加专业级通知提示
  • nix-alien实战:5个常见二进制运行问题与解决方案
  • 30 Days of SwiftUI:iOS时钟就寝时间表与侧边菜单交互实现
  • stm32读取维特陀螺仪jy61p角度
  • UHK Agent安全最佳实践:固件验证与配置备份完全手册
  • 如何免费获取全网音乐:MusicDownload开源工具完整指南
  • ESP32-BLE2MQTT常见问题解决:连接失败、数据丢失与性能优化
  • 「Java开发指南」MyEclipse for Spring参考篇——参数
  • 界面控件Kendo UI for Angular 2024 Q3亮点 - 全新的页面模板
  • JavaScript元对象协议终极指南:解锁高级面向对象编程的10个核心技巧
  • npx多包协同执行:使用-c参数运行复杂shell命令的最佳实践