(Kotlin高级特性三)Kotlin密封类(Sealed Class)在何时比枚举更适用?
密封类和枚举都是用来表示受限类层次结构的利器,它们都是代数数据类型在 Kotlin 中的体现。它们最核心的区别在于:枚举是单例实例的集合,而密封类是子类类型的集合。这个根本区别决定了它们各自的适用场景。”
核心区别:实例 vs. 类型
-
枚举:定义了一组固定的、可数的常量值。每个枚举常量都是其枚举类的单个实例。
-
例如:
enum class Direction { NORTH, SOUTH, EAST, WEST }
。NORTH
就是Direction
类型的一个唯一实例。
-
-
密封类:定义了一组固定的、可数的子类型。每个子类都可以有多个不同的实例,并且这些实例可以携带不同的状态(数据)。
-
例如:
sealed class Result<out T>
,其子类data class Success<out T>(val data: T)
和data class Error(val exception: Exception)
。你可以有无数个Success("hello")
和Success(42)
的实例,它们都是Success
子类型的实例。
-
这个“实例与类型”的区别,是解答这个问题的基石。