Kotlin可空类型与非空类型以及`lateinit` 的作用

在 Kotlin 中,变量可以是可空类型或非空类型。可空类型表示变量可以包含一个空值(null),而非空类型表示变量不能包含空值。

可空类型与非空类型

  • 非空类型 :默认情况下,Kotlin 中的变量是非空类型。例如,var recyclerView: RecyclerView 表示这个变量永远不能为 null。在编译时,Kotlin 会强制保证非空类型的变量在任何时候都不为 null

  • 可空类型 :可空类型变量可以包含 null 值。例如,var recyclerView: RecyclerView? 表示这个变量可以为 null。在使用可空类型变量时,必须进行空值检查以避免 NullPointerException

lateinit 的作用

使用 lateinit 修饰符可以声明一个非空类型的变量,并允许稍后初始化它。这在 Android 开发中很常见,因为许多视图组件(如 RecyclerView)需要在 onCreateonViewCreated 方法中初始化,而不能在声明时立即赋值。

如果不使用 lateinit,可以选择将变量声明为可空类型(即 RecyclerView?),但这样在每次使用该变量时都需要进行空值检查,增加了代码的复杂性。例如:

kotlin 复制代码
// 不使用 lateinit,声明为可空类型
private var recyclerView: RecyclerView? = null

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    // 初始化 recyclerView
    recyclerView = findViewById(R.id.my_recycler_view)

    // 使用 recyclerView 时需要进行空值检查
    recyclerView?.layoutManager = LinearLayoutManager(this)
    recyclerView?.adapter = MyAdapter(myDataset)
}

使用 lateinit 则可以避免每次使用变量时的空值检查:

kotlin 复制代码
// 使用 lateinit 声明非空类型变量
private lateinit var recyclerView: RecyclerView

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    // 初始化 recyclerView
    recyclerView = findViewById(R.id.my_recycler_view)

    // 直接使用 recyclerView,无需空值检查
    recyclerView.layoutManager = LinearLayoutManager(this)
    recyclerView.adapter = MyAdapter(myDataset)
}

总结

使用 lateinit 修饰符可以在 Kotlin 中声明一个非空类型的变量,并允许稍后初始化它,从而避免了每次使用该变量时的空值检查,提高了代码的简洁性和可读性。

代码参考

相关推荐
傻啦嘿哟6 小时前
某招聘平台爬虫:爬取招聘岗位数据,分析各城市薪资水平
开发语言·爬虫·python
2501_933670796 小时前
2026秋招量化分析岗技能栈:Python、SQL、统计建模、回测项目怎么准备
开发语言·python·sql
李少兄6 小时前
JavaScript 数据类型完全指南
开发语言·javascript·ecmascript
Seoyoneh7 小时前
Agentic Workflow编排架构:云客服从“被动响应”迈向“主动执行”的技术实现
java·开发语言·架构
Tangyuewei7 小时前
Java 写 Agent:模型只是组件
java·开发语言
tianshi48517 小时前
Android 应用启动窗口(Splash Screen)的创建与销毁流程
android
脚踏实地,坚持不懈!8 小时前
ICU Calendar 实际工作问题排查手册
android
小玮看世界8 小时前
[Python]从合并区间到传感器融合区:合并区间在传感器区域融合的实际落地
开发语言·python
ii_best8 小时前
安卓脚本/ios开发软件按键精灵实战:自动定位弹窗广告关闭按钮坐标的通用方案
android·ios·自动化
天空之城--8 小时前
Android Jetpack Compose 状态管理浅析
android·android jetpack