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")
        }
    }
}
相关推荐
NE_STOP10 小时前
Vide Coding--AI编程工具的选择
java
LDR00610 小时前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术10 小时前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript
码云数智-园园11 小时前
C++20 Modules 模块详解
java·开发语言·spring
程序员黑豆11 小时前
JDK 下载安装与配置详细教程
java·前端·ai编程
小宇宙Zz11 小时前
Maven依赖冲突
java·服务器·maven
swordbob11 小时前
NIO的channel中什么是 fd(File Descriptor,文件描述符)
java·开发语言·nio
咖啡八杯11 小时前
GoF设计模式——享元模式
java·spring·设计模式·享元模式
十五喵源码网12 小时前
基于springboot2+vue2的租房管理系统
java·毕业设计·springboot·论文笔记
摇滚侠12 小时前
IDEA 创建 Java 项目 手动整合 SSM 框架
java·ide·intellij-idea