【问题标题】:How can I create null class object in Kotlin?如何在 Kotlin 中创建空类对象?
【发布时间】:2021-01-27 17:18:55
【问题描述】:

在java中,我们可以像这样声明一个空类对象

VideoRecord videoRecord;

之后,我们可以检查它是否为空

if (videoRecord == null){
    videoRecord = new VideoRecord();
}

我是 Kotlin 的新手,我想在 Kotlin 中做同样的事情。我在下面尝试过这段代码。

lateinit var videoRecord1:VideoRecord

if (videoRecord1 == null){
    videoRecord1 = VideoRecord()
}

但它给了我一个警告,比如条件videoRecord1 == null 总是错误的。我怎样才能在 Kotlin 中做同样的事情?

【问题讨论】:

  • 您必须使用? 才能显式地使变量可以为空,例如var videoRecord1: VideoRecord?。目前,videoRecord1 不能是null,这使得警告正确。
  • 如果它为空,我将创建一个对象,并在从类创建对象后运行另一个方法,我将运行另一个方法@Lino

标签: java android class object kotlin


【解决方案1】:
var videoRecord: VideoRecord? = null

你可以像这样初始化它的变量

可空引用:https://kotlinlang.org/docs/reference/null-safety.html

【讨论】:

    【解决方案2】:

    取决于您要达到的目标,例如延迟初始化那么这可能比andika_kurniawan给出的答案更适合你:

    val videoRecord: VideoRecord by lazy { VideoRecord() } 
    

    这将延迟初始化videoRecord 第一次被访问。

    这种方式的优点是在访问videoRecord 时不必检查null,因为它不能null。这显着简化了该变量的使用。另外你可以将videoRecord标记为val,即final,所以不能被覆盖。

    @andika_kurniawan 展示的例子:

    var videoRecord: VideoRecord? = null
    

    有一些注意事项和缺点:

    1. 总是必须检查videoRecord 不是null(这很乏味),请参阅以下示例:

      if (videoRecord != null) {
          videoRecord.callAMethod()
      }
      

      上面的不会起作用,因为videoRecord定义为可空,所以需要使用!!操作符告诉kotlin你确定变量不为空:

      if (videoRecord != null) {
          videoRecord!!.callAMethod()
      }
      

      您当然可以使用其他惯用语,例如 null 安全运算符 ?.

      videoRecord?.callAMethod()
      

      或者已经提到的!! 运算符(当它是null 时会抛出异常)但是这次没有null 检查:

      videoRecord!!.callAMethod()
      

      你也可以使用局部变量,这会简化使用(一点点):

      val videoRecord = videoRecord
      if (videoRecord != null) {
          videoRecord.callAMethod()
      }
      
    2. 变量不是final,所以没有什么能阻止你在代码中的某个地方这样做:

      videoRecord = null
      
    3. 您必须在某处对其进行初始化,因此如果您有多个方法访问videoRecord,您首先必须初始化它(如果尚未初始化),这会引入不必要的冗余。

    【讨论】:

      【解决方案3】:

      在 kotlin 中,变量的声明与 java 不同,因为 kotlin 是空安全语言。您必须声明变量可为空。只有这样它的值才能为空。

      你可以声明如下

      var videoRecord: VideoRecord? = null
      

      要访问可为空的值,您必须使用 !!要么 ?带有变量名。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-13
        • 1970-01-01
        • 1970-01-01
        • 2019-07-19
        相关资源
        最近更新 更多