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")
        }
    }
}
相关推荐
-银雾鸢尾-15 分钟前
C#中的拓展方法
开发语言·c#
guodingdingh2 小时前
软件开发工作问题总结0718
java·开发语言·数据库
咖啡八杯4 小时前
GoF设计模式——解释器模式
java·后端·spring·设计模式
优橙教育4 小时前
5G网优培训 vs Java开发:转行选哪个?
java·开发语言·5g
GitLqr4 小时前
Flutter 无障碍开发实战:玩转 Semantics 解决视障用户使用痛点
android·flutter·dart
糖果店的幽灵4 小时前
【DeepAgents 从入门到精通】Context Management 上下文管理
java·人工智能·后端·spring·中间件·langgraph·deepagents
腻害兔6 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:字典、短信、邮件、通知——后台系统的“基础设施四件套“!
java·前端·vue.js·产品经理·ai编程
SeaTunnel6 小时前
从 Python Script 地狱到标准化数据集成框架
大数据·开发语言·python·程序员·代码·seatunnel
碎光拾影6 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库
Marst Code7 小时前
(python)2026Plotly 库评估:交互式可视化到底值不值得引入?
开发语言·python