Kotlin开发实战:lateinit和lazy的5个常见使用场景与避坑指南
在Android开发中,属性初始化的时机选择往往直接影响应用的稳定性和性能。Kotlin作为Android官方推荐语言,提供了lateinit和lazy两种延迟初始化机制,但许多开发者对它们的使用场景和潜在风险仍存在困惑。本文将深入剖析5个典型场景下的最佳实践,帮助你在ViewModel管理、依赖注入等场景中做出明智选择。
1. ViewModel中的属性初始化策略
在MVVM架构中,ViewModel经常需要管理那些生命周期长于Activity但又不需要立即初始化的属性。这里lateinit和lazy展现出截然不同的行为特征。
lateinit适用场景:当属性需要通过依赖注入或异步回调来初始化时。比如Retrofit服务接口的初始化:
class UserViewModel : ViewModel() {
lateinit var userService: UserService
fun initService(retrofit: Retrofit) {
userService = retrofit.create(UserService::class.java)
}
fun fetchUser() {
if(::userService.isInitialized) {
// 发起网络请求
}
}
}
lazy的优势场景:当初始化逻辑简单且线程安全时。比如数据库访问对象的创建:
class SettingsViewModel : ViewModel() {
val preferencesDao by lazy {
AppDatabase.getInstance().preferencesDao()
}
fun getSettings() = preferencesDao.getAll()
}
关键区别对比:
| 特性 | lateinit var | lazy val |
|---|---|---|
| 线程安全 | 不安全 | 默认安全(SYNCHRONIZED) |
| 空检查 | 需要显式检查 | 自动处理 |
| 重新赋值 | 支持 | 禁止 |
| 初始化时机 | 开发者控制 | 首次访问时 |
| 适用类型 | 可变变量(var) | 只读属性(val) |
提示:在ViewModel中使用
lateinit时,务必配合isInitialized检查,避免因配置变更导致属

3212

被折叠的 条评论
为什么被折叠?



