【问题标题】:Kotlin - lateinit VS Any? = nullKotlin - lateinit VS 任何? =空
【发布时间】:2016-06-11 23:52:15
【问题描述】:

在 Kotlin 中,似乎有两种方法可以在对象内声明一个变量,该变量可以为 null 并在对象创建后实例化。

var myObject : Any? = null

var lateinit myObject : Any  

如果我们可以让 var 可以为空并稍后分配它,为什么需要 lateinit 关键字,我感到很困惑。每种方法的优缺点是什么?每种方法应该在什么情况下使用?

【问题讨论】:

    标签: android kotlin kotlin-null-safety


    【解决方案1】:

    根据我目前在 Kotlin 中的知识,这是我对差异的看法。

    第一个:

    var myObject1 : Any? = null
    

    这里的myObject1 是一个可以为空的属性。这意味着您可以将null 分配给它。

    第二个:

    lateinit var myObject2 : Any
    

    这里myObject2 是一个非空属性。这意味着您不能将null 分配给它。通常如果一个属性是非空的,你必须在声明时初始化它。但是添加关键字lateinit 可以让您推迟初始化。如果您在初始化之前尝试访问lateinit 属性,则会出现异常。

    简而言之,主要区别在于myObject1 是可空的,myObject2 是非空的。关键字lateinit 为您提供了一种方便的机制,允许稍后初始化非空属性,而不是在声明时对其进行初始化。

    更多信息请查看this

    【讨论】:

    • 那么活动的上下文属于不可为空还是可以为空的属性?
    【解决方案2】:

    lateinit 关键字用于avoid 在引用对象内部的字段时进行空检查。该关键字主要在你使用依赖注入初始化变量时使用,或者在单元测试的 setup 方法中初始化变量时使用

    ? 用于字段稍后将在程序中由 setter 或对象方法内部初始化该字段,这是为了强制您检查 null 或使用 null 安全性(@987654324 @) 引用字段时

    【讨论】:

      【解决方案3】:

      如果您的属性不应该是null,但只是在未来某个时间点之后没有设置,那么使用lateinit 关键字声明它会更安全。这保证了,如果您在设置之前访问它,您会得到一个异常解释。

      传统的 Java 方法是抛出一个通用的 NullPointerException 而不做任何解释。如果您自己编写代码,您可能会有线索,但如果其他人发现错误,则不清楚为什么该特定变量是null

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-13
        • 2022-12-15
        • 2020-04-26
        相关资源
        最近更新 更多