Kotlin Enum vs Sealed Class

在 Kotlin 和 Android 开发中,我们经常需要在代码中表达"一组受限的类型"。初学者往往会陷入纠结:我该用老牌的 Enum(枚举) ,还是用 Kotlin 独有的 Sealed Class(密封类) ?

虽然它们看起来很像,但如果你选错了,代码可能会变得臃肿且难以维护。今天我们参考 DroidDev 的深度解析,彻底理清这两者的边界。


一、 Enum:忠诚的卫兵(固定常量)

Enum 是最基础的选择。它代表了一组固定且唯一的常量值。

  • 核心特性 :所有枚举成员都是该类的单例,且它们具有相同的属性。
  • 适用场景:当你只需要代表某种"状态"或"分类",且这些分类不需要携带额外的、各不相同的数据时。
kotlin 复制代码
enum class NetworkStatus(val label: String) {
    CONNECTED("已连接"),
    DISCONNECTED("已断开"),
    LOADING("加载中")
}

痛点 :如果你想让 CONNECTED 携带一个 IP 地址,而 DISCONNECTED 携带一个错误信息,Enum 就无能为力了,因为它要求所有成员的结构必须一模一样。


二、 Sealed Class:变形金刚(动态状态)

如果说 Enum 是"枚举",那么 Sealed Class 就是"受限的类层级"。它是 Enums on steroids(加强版枚举) 。

  • 核心特性 :每一个子类都可以有自己独特的属性和构造函数。
  • 适用场景:在 Android UI 状态管理(如 MVI 或 MVVM)中,它是绝对的主角。
kotlin 复制代码
sealed class UiState {
    object Loading : UiState()
    data class Success(val data: List<String>) : UiState() // 携带列表数据
    data class Error(val message: String, val code: Int) : UiState() // 携带错误详情
}

在上面的例子中,Success 和 Error 携带的信息完全不同,这在 Enum 中是无法实现的。


三、 深度对比:该选哪一个?

为了让你一眼看穿,我准备了这张对比表:

特性 Enum Class Sealed Class
实例性质 每个常量都是单例 子类可以是 object(单例)或 class(多例)
状态持有 所有成员共享相同的属性字段 每个子类可以有完全不同的属性和状态
内存开销 较低(静态常量) 略高(涉及对象实例化)
扩展性 无法拥有动态状态 极其灵活,支持复杂的层次结构
编译器支持 when 表达式必须覆盖所有分支 同上,如果不覆盖则编译报错(穷举性检查)

四、 决策指南:场景实验室

1. 选 Enum 的情况

  • 星期/月份 :Monday, Tuesday...
  • 简单的方向 :North, South, East, West。
  • 简单的类型标识 :比如 UserType.ADMIN 或 UserType.GUEST。

2. 选 Sealed Class 的情况

  • API 响应结果 :Success(data), Failure(exception), Loading。
  • 复杂的 UI 状态:界面需要根据不同的状态显示不同的数据。
  • 支付方式 :CreditCard(number, cvv), PayPal(email), Cash。

五、 总结

  • 如果你处理的是纯粹的常量 ,没有任何独特的状态需求,请坚持使用 Enum,它的意图更明确,性能也更优。
  • 如果你处理的是逻辑状态 ,且不同状态之间需要传递不同的数据模型,请毫不犹豫地选择 Sealed Class。

利用 Kotlin 编译器的穷举性检查(Exhaustiveness Check) ,无论你选哪一个,配合 when 表达式都能确保你的业务逻辑没有任何漏洞。

相关推荐
熊猫钓鱼>_>3 小时前
Kotlin Multiplatform for OpenHarmony 实战:为 Landscapist 实现图片加载适配
开发语言·kotlin·华为云·ai编程·harmonyos·鸿蒙·openharmony
ZealSinger4 小时前
Kotlin2.4迁移context parameters
kotlin·协程·迁移·kotlin2.4
墨天梦5 小时前
B16_Material主题与可访问交互
android·kotlin·交互
alexhilton17 小时前
模块化Jetpack Compose架构
android·kotlin·android jetpack
mmsx1 天前
Android 测绘计算工程化:七四参数、高程拟合与单位系统
android·kotlin
事圆则缓1 天前
Kotlin Flow、StateFlow、SharedFlow 全解析:冷流、热流与 Android 状态管理
android·kotlin·php
应用市场1 天前
把旧 Pixel 变成相册备份中转站(上):Mac 到安卓的照片传输工具设计——流式上传、sha256 校验、adb forward 与 Bonjour
android·macos·adb·kotlin·swift
Kapaseker1 天前
Android 以后可能不会再有横竖屏适配了
android·kotlin
墨天梦1 天前
B13_通知图片相机与影音
android·数码相机·kotlin
传奇开心果编程2 天前
【Compose Multiplatform 跨端开发学与练】第7课 平台适配与互操作
android·windows·学习·ui·ios·kotlin·composer