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 中声明一个非空类型的变量,并允许稍后初始化它,从而避免了每次使用该变量时的空值检查,提高了代码的简洁性和可读性。

代码参考

相关推荐
散峰而望4 小时前
【算法竞赛】C++函数详解:从定义、调用到高级用法
c语言·开发语言·数据结构·c++·算法·github
冷凝雨4 小时前
复数乘法(C & Simulink)
c语言·开发语言·信号处理·simulink·dsp
CoderCodingNo4 小时前
【GESP】C++五级真题(贪心思想考点) luogu-B4071 [GESP202412 五级] 武器强化
开发语言·c++·算法
0和1的舞者4 小时前
Spring AOP详解(一)
java·开发语言·前端·spring·aop·面向切面
MoonBit月兔4 小时前
年终 Meetup:走进腾讯|AI 原生编程与 Code Agent 实战交流会
大数据·开发语言·人工智能·腾讯云·moonbit
智航GIS4 小时前
8.2 面向对象
开发语言·python
梦幻通灵4 小时前
Mysql字段判空实用技巧
android·数据库·mysql
小小星球之旅4 小时前
CompletableFuture学习
java·开发语言·学习
kylezhao20195 小时前
C# 语言基础(变量、数据类型、流程控制、面向对象编程)
开发语言·计算机视觉·c#·visionpro
咯哦哦哦哦5 小时前
WSL + ubantu22.04 + 远程桌面闪退+黑屏闪退解决
linux·开发语言