
前面几节讲的是"数据怎么流动",这一节讲"状态怎么组织"。sealed class在 Kotlin 里最常见的用途就是建模状态机——把界面/业务可能处于的若干种状态显式列出来,让编译器帮你检查所有分支。上一节的属性委托是"怎么存",这一节是"有哪些状态以及怎么在状态间迁移"。先把结论放在前面:这一题的核心不是语法,而是状态机的三条设计原则。①状态完备:所有可能状态必须写进 sealed 的子类或 object 分支,漏一个编译器就报错。②状态互斥:同一时刻只能处于一个状态,用 sealed 的互斥结构保证,而不是靠多个可空字段拼凑。③迁移可追踪:状态变化只通过一个入口(reduce/emit),不允许多处直接改状态。满足这三条,界面状态就不可能出现"Loading 又是 Error 又没有数据"这种矛盾态。机制拆解sealed class的关键特性是:它的直接子类必须与它写在同一个文件里(Kotlin 1.5 之后放宽到同包同模块),且when表达式对 sealed 类型做穷举检查——不写else也会被要求覆盖所有分支。这条编译期约束正是状态机的价值来源。它和枚举的差别要说清:枚举的实例是固定的、每个实例本身就是单例;sealed 的分支可以带数据(data class Error(val code: Int, val msg: String)/