请教:Kotlin枚举常量单实例与密封类子类多实例的含义及示例
理解Kotlin枚举与密封类的实例差异
这句话的核心是区分枚举类型和密封类子类在实例化与状态承载上的本质不同:
1. 枚举常量:全局唯一单实例
枚举的每个常量都是全局唯一的单例,无论你多少次引用同一个枚举常量,拿到的都是同一个对象,且枚举常量本身无法携带自定义的动态状态(只能依赖自身固定属性)。
示例代码:
enum class Direction { NORTH, SOUTH, EAST, WEST } fun main() { val dir1 = Direction.NORTH val dir2 = Direction.NORTH // 用 === 判断对象引用是否一致,枚举常量是同一个实例 println(dir1 === dir2) // 输出 true }
2. 密封类子类:多实例+自定义状态
密封类的子类(比如data class、普通class)可以创建多个独立的实例,每个实例都能携带专属的动态状态数据。这也是密封类比枚举更灵活的核心原因——它能表示带有动态数据的类型分支。
示例代码:
sealed class NetworkResponse // Success子类携带响应数据 data class SuccessResponse(val data: String) : NetworkResponse() // Error子类携带错误信息和错误码 data class ErrorResponse(val message: String, val code: Int) : NetworkResponse() fun main() { val userSuccess = SuccessResponse("用户信息:张三,25岁") val orderSuccess = SuccessResponse("订单信息:编号123,金额99元") // 两个SuccessResponse是不同的实例 println(userSuccess === orderSuccess) // 输出 false // 各自携带不同的状态数据 println(userSuccess.data) // 输出 "用户信息:张三,25岁" println(orderSuccess.data) // 输出 "订单信息:编号123,金额99元" }
一句话总结
- 枚举:固定选项、无动态状态,每个选项仅存在一个实例
- 密封类子类:可承载动态状态,可根据需求创建多个独立实例
内容的提问来源于stack exchange,提问作者Sagar Patel
相关产品推荐
相关产品推荐

