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")
        }
    }
}
相关推荐
wuminyu5 分钟前
ForkJoinPool窃取线程在扫描其他WorkQueue时的随机采样算法与Phase线程挂起唤醒机制解析
java·linux·c语言·jvm·c++
Sarvartha14 分钟前
内部类知识
java·开发语言
Knight_AL17 分钟前
从 EasyExcel 到 Apache Fesod:Java Excel 处理生态的一次重构
java·apache·excel
yuniko-n22 分钟前
【JUC】集合线程安全
java
骑着蜗牛撵大象32736 分钟前
服务下线不再炸:分层关闭、TCP 存活探测与负载均衡排水的落地套路
android·tcp/ip·负载均衡·tcp·高可用·健康检查·优雅关闭
FPGA小徐1 小时前
【一生一芯 / PA】异常响应机制:RISC-V 中 ecall → mtvec → mret 的完整代
开发语言·数据库·c#
北京盛世宏博1 小时前
工业环境监测选型:Modbus TCP以太网温湿度传感器部署、调试、避坑全指南
开发语言·网络·php
沫璃染墨1 小时前
《Linux工程实践篇(二):线程池实战——从线程安全单例到完整源码实现》
linux·开发语言·c++·单例模式·设计模式·系统架构
starzy19901 小时前
Flink SlotManager启动流程源码深度剖析:从ResourceManager到Slot分配的完整链路
java·大数据·flink
极光通讯1 小时前
服务器内存来料检验(IQC)实操:批次追溯、外观判定与上机验证
java·服务器·算法