【问题标题】:Why do I have to return Unit.INSTANCE in a void kotlin function, when called from Java, and not NULL?为什么从 Java 调用时,我必须在 void kotlin 函数中返回 Unit.INSTANCE,而不是 NULL?
【发布时间】:2020-02-17 17:04:14
【问题描述】:

当有功能时,例如:

fun doSomething(action:() -> Unit) {
   action.invoke()
}

如果我从 Java 中调用它,代码必须是:

doSomething(() -> {
   //do something
   return Unit.INSTANCE
})

我已经看到了代码,而不是使用

doSomething(() -> {
   //do something
   return null
})

是否会影响发送null 而不是Unit.INSTANCE? Kotlin 是否通过验证是否返回了 UNIT 实例来执行更多操作?

【问题讨论】:

    标签: java kotlin lambda null


    【解决方案1】:

    我认为大多数时候使用nullUnit.INSTANCE 并不重要。但是,由于至少有 1 种情况不希望使用这种 null,因此您可能应该始终使用 Unit.INSTANCE

    不返回Unit.INSTANCE 会导致问题的虚构示例如下:

    fun doSomething(action:() -> Unit) {
       action.invoke() logReturnTime("after action invocation")
    }
    infix fun Unit.logReturnTime(msg : String) { TODO("logging return time $msg") }
    

    如果您调用它并返回null,您将得到IllegalArgumentException,而如果您使用Unit.INSTANCE,代码将毫无问题地运行。

    话虽如此,我不认为这是一个很好的例子,但它清楚地表明,如果有人对 Unit 进行操作,那么它可能会失败,所以你最好总是使用 Unit.INSTANCE 并且你是安全的,不管接收器对你的函数做了什么。

    【讨论】:

      【解决方案2】:

      Kotlin 中的任何方法都会返回一个值。 “void”方法总是返回Unit 类型的一个实例,即Unit.INSTANCE。您可以在声明中省略返回类型单元,但会隐式添加它并在方法末尾返回值。 https://kotlinlang.org/docs/reference/basic-syntax.html

      因此,当从 Java 代码调用 Kotlin 方法时,您需要填写相同的合约并返回一些内容。如果你返回null 是对Unit 类型的空引用。仅仅因为避免空引用更好,以防调用者想要对您的方法的结果采取行动,您应该避免返回null,而是返回Unit.INSTANCE。是的,这种情况不太可能发生,但会导致最烦人的错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-08-26
        • 2019-10-25
        • 1970-01-01
        • 1970-01-01
        • 2016-04-10
        • 2010-10-28
        • 2022-01-17
        相关资源
        最近更新 更多