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() // 携带错误详情
}

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


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

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

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

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

1. 选 Enum 的情况

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

2. 选 Sealed Class 的情况

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

五、 总结

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

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

相关推荐
Kapaseker9 小时前
一杯美式讲完 Sealed Class
android·kotlin
Kapaseker1 天前
详解 Compose background 的重组陷阱
android·kotlin
黄林晴1 天前
Kotlin 2.3.20-RC2 来了!JPA 开发者狂喜,6 大更新一文速览
android·kotlin
糖猫猫cc2 天前
Kite:填充处理器
kotlin·orm·kite
Kapaseker2 天前
一杯美式深入理解 data class
android·kotlin
alexhilton5 天前
端侧RAG实战指南
android·kotlin·android jetpack
Kapaseker5 天前
2026年,我们还该不该学编程?
android·kotlin
Kapaseker6 天前
一杯美式搞懂 Any、Unit、Nothing
android·kotlin
Kapaseker7 天前
一杯美式搞定 Kotlin 空安全
android·kotlin
FunnySaltyFish8 天前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack