🔹 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状态、表达式分支等 |