核心内容摘要
C++ 中面向对象编程(OOP)核心概念——**类的定义、封装、继承及类层次结构**——的清晰概述
Java 枚举类enum详解
基本概念Java 枚举enum是 JDK
5 引入的一种特殊的数据类型用于定义固定数量的常量集合。
它本质上是一个特殊的类继承自java.lang.Enum具有以下核心特性编译后生成.class文件所有枚举值都是public static final的实例自动实现Comparable和Serializable接口线程安全的单例模式实现
基础语法与用法
简单枚举定义publicenumDay{MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY;}
带参数的枚举publicenumColor{RED(红色,#FF
,GREEN(绿色,#00FF
,BLUE(蓝色,#0000FF);privatefinalStringname;privatefinalStringhexCode;// 枚举构造器必须是 private默认就是 privateColor(Stringname,StringhexCode){this.namename;this.hexCodehexCode;}publicStringgetName(){returnname;}publicStringgetHexCode(){returnhexCode;}}
枚举方法publicenumOperation{PLUS(){Overridepublicdoubleapply(doublex,doubley){returnxy;}},MINUS(-){Overridepublicdoubleapply(doublex,doubley){returnx-y;}};privatefinalStringsymbol;Operation(Stringsymbol){this.symbolsymbol;}// 抽象方法每个枚举常量必须实现publicabstractdoubleapply(doublex,doubley);publicStringgetSymbol(){returnsymbol;}}
枚举的核心特性
内置方法方法说明values()返回所有枚举值的数组静态方法valueOf(String name)根据名称返回对应的枚举值静态方法name()返回枚举常量的名称ordinal()返回枚举常量的序号从0开始compareTo(E other)比较两个枚举值的顺序toString()返回枚举常量的名称可重写
使用示例publicclassEnumDemo{publicstaticvoidmain(String[]args){// 遍历所有枚举值for(Dayday:Day.values()){System.out.println(day);}// 根据字符串获取枚举值DaytodayDay.valueOf(MONDAY);// 获取序号和名称System.out.println(today.ordinal());// 0System.out.println(today.name());// MONDAY// 比较System.out.println(Day.MONDAY.compareTo(Day.TUESDAY));// -1// 使用带参数的枚举System.out.println(Color.RED.getName());// 红色}}
枚举的高级特性
实现接口publicinterfaceDescribable{StringgetDescription();}publicenumStatusimplementsDescribable{ACTIVE(活跃状态),INACTIVE(非活跃状态),PENDING(待处理状态);privatefinalStringdescription;Status(Stringdescription){this.descriptiondescription;}OverridepublicStringgetDescription(){returndescription;}}
枚举中的抽象方法publicenumPlanet{MERCURY(
303e23,
4397e
,VENUS(
869e24,
0518e
,EARTH(
976e24,
37814e
;privatefinaldoublemass;// 质量千克privatefinaldoubleradius;// 半径米Planet(doublemass,doubleradius){this.massmass;this.radiusradius;}privatedoublemass(){returnmass;}privatedoubleradius(){returnradius;}// 计算表面重力publicdoublesurfaceGravity(){returnG*mass/(radius*radius);}publicdoublesurfaceWeight(doubleotherMass){returnotherMass*surfaceGravity();}privatestaticfinaldoubleG
67300E-11;}
枚举的单例特性// 线程安全的单例实现publicenumSingleton{INSTANCE;publicvoiddoSomething(){System.out.println(Singleton operation);}}// 使用Singleton.INSTANCE.doSomething();
枚举 vs 常量 vs 静态类特性枚举常量类静态工具类类型安全✅❌❌编译时检查✅❌❌序列化安全✅⚠️⚠️方法支持✅❌✅单例保证✅⚠️⚠️可扩展性✅❌✅
最佳实践与
注意事项
最佳实践优先使用枚举替代int常量Effective Java 第30条为枚举添加描述信息而不是直接使用name()利用枚举实现策略模式在switch语句中使用枚举编译器会检查完整性
switch语句示例publicStringgetDayType(Dayday){switch(day){caseSATURDAY:caseSUNDAY:returnWeekend;default:returnWeekday;}}
3.
注意事项不要使用ordinal()进行持久化枚举顺序可能改变避免在枚举中存储可变状态除非明确需要枚举构造器不能是public或protected枚举不能被继承隐式final枚举实例在类加载时创建且只会创建一次
实际应用场景
状态机publicenumOrderStatus{PENDING,CONFIRMED,SHIPPED,DELIVERED,CANCELLED;publicbooleancanTransitionTo(OrderStatusnewStatus){// 实现状态转换逻辑returntrue;}}
错误码定义publicenumErrorCode{SUCCESS(200,操作成功),NOT_FOUND(404,资源未找到),SERVER_ERROR(500,服务器内部错误);privatefinalintcode;privatefinalStringmessage;ErrorCode(intcode,Stringmessage){this.codecode;this.messagemessage;}// getter方法...}
配置选项publicenumDatabaseType{MYSQL(com.mysql.cj.jdbc.Driver),POSTGRESQL(org.postgresql.Driver),ORACLE(oracle.jdbc.driver.OracleDriver);privatefinalStringdriverClass;DatabaseType(StringdriverClass){this.driverClassdriverClass;}publicStringgetDriverClass(){returndriverClass;}}
八、
总结Java枚举是一个功能强大且安全的特性它不仅提供了类型安全的常量定义方式还支持面向对象的特性如方法、字段和继承接口。
合理使用枚举可以提高代码的可读性和可维护性避免魔法数字和字符串提供编译时类型检查实现复杂的行为模式记住任何时候当你需要一组固定的常量时都应该优先考虑使用枚举而不是int常量或String常量。