Kotlin 开发 - lateinit 关键字

lateinit

1、基本介绍
  1. lateinit 用于延迟初始化非空属性,避免声明时立即赋值或使用可空类型

  2. lateinit 只能用于 var,不能用于 val

  3. 类型必须是非空的引用类型,不能是 Int、Boolean 等基本类型

  4. 声明时不能有初始值

  • 何时不用 lateinit,可以用可空类型 var data: String? = null 替代,但每次使用都要 ?. 调用,不够简洁
2、演示
  1. 基本使用
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
  1. 未初始化时访问会抛出 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
  1. 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'.
  1. 类型必须是非空的引用类型,不能是 Int、Boolean 等基本类型,否则编译失败
kotlin 复制代码
class Person {
    private lateinit var num: Int
}
复制代码
# 输出结果

'lateinit' modifier 'is not allowed on properties of primitive types'.
  1. 声明时不能有初始值,否则编译失败
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")
        }
    }
}
相关推荐
m0_587383002 小时前
点餐预约核销系统的架构脉络
java·架构·系统架构·需求分析
前端 贾公子2 小时前
第10章:RAG(2)
开发语言·python
代码方舟2 小时前
O2O二手车交易平台B端车商管理后台:基于天远车信盟出险构建自动化车况评估网关
java·运维·人工智能·自动化
爱学堂IT分享2 小时前
图灵Java互联网架构师六期
java·开发语言
坐吃山猪2 小时前
【多线程】Semaphore使用
java·数据库·oracle·多线程
Android-Flutter2 小时前
flutter GetX 详解
android·flutter
传奇开心果编程3 小时前
【Rust入门知识点学与练】第3课:String 与 &str 的区别
开发语言·学习·rust
秋名RG3 小时前
Java 核心特性一览
java·开发语言
霸道流氓气质3 小时前
Spring AI 技术细节:RAG QuestionAnswerAdvisor 设计与实现
java·人工智能·spring
平头哥AI3 小时前
Day 01 | go run 跑通第一个 Go 程序,go build 留下一个能拷走的 exe
开发语言·后端·golang