lateinit
1、基本介绍
-
lateinit 用于延迟初始化非空属性,避免声明时立即赋值或使用可空类型
-
lateinit 只能用于 var,不能用于 val
-
类型必须是非空的引用类型,不能是 Int、Boolean 等基本类型
-
声明时不能有初始值
- 何时不用 lateinit,可以用可空类型
var data: String? = null替代,但每次使用都要?.调用,不够简洁
2、演示
- 基本使用
kotlin
class UserService {
fun getUsers(): List<String> = listOf("Alice", "Bob")
}
class UserController {
private lateinit var userService: UserService
fun initialize() {
userService = UserService()
}
fun showUsers() {
if (::userService.isInitialized) {
println(userService.getUsers())
} else {
println("service not ready")
}
}
}
kotlin
val userController = UserController()
userController.initialize()
userController.showUsers()
# 输出结果
[Alice, Bob]
kotlin
val userController = UserController()
userController.showUsers()
# 输出结果
service not ready
- 未初始化时访问会抛出 UninitializedPropertyAccessException 异常
kotlin
class UserService {
fun getUsers(): List<String> = listOf("Alice", "Bob")
}
class UserController {
private lateinit var userService: UserService
fun initialize() {
userService = UserService()
}
fun showUsers() {
println(userService.getUsers())
}
}
kotlin
val userController = UserController()
userController.showUsers()
# 输出结果
kotlin.UninitializedPropertyAccessException: lateinit property userService has not been initialized
- lateinit 不能用于 val,否则编译失败
kotlin
class UserService {
fun getUsers(): List<String> = listOf("Alice", "Bob")
}
class UserController {
private lateinit val userService: UserService
fun initialize() {
userService = UserService()
}
fun showUsers() {
if (::userService.isInitialized) {
println(userService.getUsers())
} else {
println("service not ready")
}
}
}
# 输出结果
'lateinit' modifier 'is allowed only on mutable properties'.
- 类型必须是非空的引用类型,不能是 Int、Boolean 等基本类型,否则编译失败
kotlin
class Person {
private lateinit var num: Int
}
# 输出结果
'lateinit' modifier 'is not allowed on properties of primitive types'.
- 声明时不能有初始值,否则编译失败
kotlin
class UserService {
fun getUsers(): List<String> = listOf("Alice", "Bob")
}
class UserController {
private lateinit var userService: UserService = UserService()
fun initialize() {
userService = UserService()
}
fun showUsers() {
if (::userService.isInitialized) {
println(userService.getUsers())
} else {
println("service not ready")
}
}
}