• 能说一说 Kotlin 中 lateinit 和 lazy 的区别吗?


    使用 Kotlin 进行开发,对于 latelinit 和 lazy 肯定不陌生。但其原理上的区别,可能鲜少了解过,借着本篇文章普及下这方面的知识。

    lateinit

    用法

    非空类型可以使用 lateinit 关键字达到延迟初始化。

    1.  class InitTest() {
    2.      lateinit var name: String
    3.  ​
    4.      public fun checkName(): Boolean = name.isNotEmpty()
    5.  }
    6. 复制代码

    如果在使用前没有初始化的话会发生如下 Exception。

    1.  AndroidRuntime: FATAL EXCEPTION: main
    2.       Caused by: kotlin.UninitializedPropertyAccessException: lateinit property name has not been initialized
    3.         at com.example.tiramisu_demo.kotlin.InitTest.getName(InitTest.kt:4)
    4.         at com.example.tiramisu_demo.kotlin.InitTest.checkName(InitTest.kt:10)
    5.         at com.example.tiramisu_demo.MainActivity.testInit(MainActivity.kt:365)
    6.         at com.example.tiramisu_demo.MainActivity.onButtonClick(MainActivity.kt:371)
    7.         ...
    8. 复制代码

    为防止上述的 Exception,可以在使用前通过 ::xxx.isInitialized 进行判断。

    1.  class InitTest() {
    2.      lateinit var name: String
    3.  ​
    4.      fun checkName(): Boolean {
    5.          return if (::name.isInitialized) {
    6.              name.isNotEmpty()
    7.         } else {
    8.              false
    9.         }
    10.     }
    11.  }
    12. 复制代码
    1.  Init: testInit():false
    2. 复制代码

    当 name 初始化过之后使用亦可正常。

    1.  class InitTest() {
    2.      lateinit var name: String
    3.  ​
    4.      fun injectName(name: String) {
    5.          this.name = name
    6.     }
    7.  ​
    8.      fun checkName(): Boolean {
    9.          return if (::name.isInitialized) {
    10.              name.isNotEmpty()
    11.         } else {
    12.              false
    13.         }
    14.     }
    15.  }
    16. 复制代码
    1.  Init: testInit():true
    2. 复制代码

    原理

    反编译之后可以看到该变量没有 @NotNull 注解,使用的时候要 check 是否为 null。

    1.  public final class InitTest {
    2.     public String name;
    3.        
    4.     @NotNull
    5.     public final String getName() {
    6.        String
  • 相关阅读:
    信息学奥赛一本通:1159:斐波那契数列
    【768. 最多能完成排序的块 II】
    Hadoop3:MapReduce源码解读之Map阶段的TextInputFormat切片机制(3)
    数据结构—排序
    SBOM落地的关键一步——漏洞可利用性交流(VEX)
    读像火箭科学家一样思考笔记05_思想实验
    接口办自动化测试-postman知识点总览(一)
    车载数据中心方案
    【STM32】片上ADC的初步使用
    #哈希表 电话号码查询系统(线性和链式)#
  • 原文地址:https://blog.csdn.net/dageliuqing/article/details/127093946