🔹 1. 延迟初始化 (lateinit)

✅ 用途:

当你不想在定义变量时立刻初始化它,但又确定在使用前一定会初始化(比如依赖注入、测试、Android View 绑定等)。

✅ 语法:

1
2

lateinit var name: String

✅ 注意事项:

  • 只能用于 **var**,不能用于 val
  • 只能用于 非空类型的引用类型(不能是原始类型如 IntDouble)。
  • 使用前如果没初始化,会抛出 **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状态、表达式分支等