🔹 1. 延迟初始化 (lateinit)
✅ 用途:
当你不想在定义变量时立刻初始化它,但又确定在使用前一定会初始化(比如依赖注入、测试、Android View 绑定等)。
✅ 语法:
1 2
| lateinit var name: String
|
✅ 注意事项:
- 只能用于 **
var**,不能用于 val。
- 只能用于 非空类型的引用类型(不能是原始类型如
Int、Double)。
- 使用前如果没初始化,会抛出 **
UninitializedPropertyAccessException**。
✅ 示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| class User { lateinit var nickname: String
fun initNickname() { nickname = "KotlinFan" }
fun printNickname() { if (::nickname.isInitialized) { println(nickname) } else { println("nickname 尚未初始化") } } }
|
🔹 2. 密封类(sealed class)
✅ 用途:
用于表示受限的类继承结构,所有子类都必须声明在同一个文件中。常用于表示状态、结果、事件等。
类似于 Java 的 enum,但可以携带数据。常配合 when 表达式使用,可以 无需 else 分支。
✅ 示例:
1 2 3 4 5 6 7 8 9 10 11 12 13
| sealed class Result
data class Success(val data: String) : Result() data class Error(val message: String) : Result() object Loading : Result()
fun handleResult(result: Result) { when (result) { is Success -> println("成功: ${result.data}") is Error -> println("失败: ${result.message}") Loading -> println("加载中...") } }
|
🔸 总结对比
| 特性 |
lateinit |
sealed class |
| 用途 |
延迟初始化引用变量 |
表示受限的继承结构,常用于状态建模 |
| 限制 |
不能用于 val 或基本类型 |
所有子类必须在同一文件中定义 |
| 常用场景 |
Android View、依赖注入等 |
网络请求结果、UI状态、表达式分支等 |