重新认识枚举enum

发布时间:2026/7/6 20:55:32
重新认识枚举enum 定义在 Java 中enum枚举是一种特殊的类用于定义固定数量的常量集合。它从 JDK 5Java 1.5 开始引入目的是替代传统的 public static final int 常量提供类型安全、可读性强、功能丰富的常量管理方式publicenumDay{MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY;}扩展publicenumDay{MONDAY(MONDAY,0),TUESDAY(TUESDAY,1);}相当于publicfinalclassDayextendsjava.lang.EnumDay{publicstaticfinalDayMONDAYnewDay(MONDAY,0);publicstaticfinalDayTUESDAYnewDay(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() → 0name()返回常量名称Day.MONDAY.name() → MONDAYcompareTo()按声明顺序比较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.303e23,2.4397e6),VENUS(4.869e24,6.0518e6),EARTH(5.976e24,6.37814e6),MARS(6.421e23,3.3972e6);// 字段通常为 private finalprivatefinaldoublemass;// 质量kgprivatefinaldoubleradius;// 半径m// 构造函数只能是 private 或 package-private默认 privatePlanet(doublemass,doubleradius){this.massmass;this.radiusradius;}// 方法publicdoublegetMass(){returnmass;}publicdoublegetRadius(){returnradius;}// 计算表面重力g G * M / r^2publicdoublesurfaceGravity(){return6.67300E-11*mass/(radius*radius);}// 计算某物体在该星球上的重量publicdoublesurfaceWeight(doubleotherMass){returnotherMass*surfaceGravity();}}publicclassMain{publicstaticvoidmain(String[]args){PlanetearthPlanet.EARTH;System.out.println(Earths gravity: earth.surfaceGravity());System.out.println(My weight on Mars: Planet.MARS.surfaceWeight(70));// 70kg 人在火星的重量}}内置常用方法高级用法每个常量有不同行为抽象方法publicenumOperation{PLUS{publicdoubleapply(doublex,doubley){returnxy;}},MINUS{publicdoubleapply(doublex,doubley){returnx-y;}},TIMES{publicdoubleapply(doublex,doubley){returnx*y;}},DIVIDE{publicdoubleapply(doublex,doubley){returnx/y;}};// 抽象方法 → 每个常量必须实现publicabstractdoubleapply(doublex,doubley);}doubleresultOperation.PLUS.apply(5,3);// 8.0特性说明枚举常量必须在第一行所有CONSTANT(...)必须出现在字段/方法之前构造函数只能是private不能public或protected防止外部 new字段建议用final枚举常量通常是不可变的可以实现接口enum MyEnum implements Runnable { ... }不能继承其他类因为enum隐式继承java.lang.EnumJava 不支持多继承可以有静态方法/字段如values(),valueOf(String)是自动生成的总结Java 的 enum 远不止是“常量集合”它是一个功能完整的类支持字段 构造函数 方法 接口 多态行为合理使用能让代码更安全、清晰、可维护是 Java 中被低估的强大特性。