19

哪种解决方案更好?使用可为空的 lambda 或将空 lambda 作为默认参数传递?kotlin 会以某种方式优化空 lambda,还是创建一个什么都不做的新实例?

class Test1(val action: () -> Unit = {})

不幸的是,我不理解生成的字节码。我们来分析一下

val test11 = Test1()

反编译后给我们:

private static final Test1 test11 = new Test1((Function0)null, 1, (DefaultConstructorMarker)null);

最后,当传递一个 lambda 时,如下所示:

var1 = (Function0)null.INSTANCE;

编辑:隐藏的问题是:Kotlin 如何将空 lambda 视为默认值?

4

2 回答 2

15

传递一个空的 lambda 而不是 null 作为 lambda 参数的默认值肯定更惯用。

IntelliJ IDEA 中使用的反编译器并不总是能特别好地处理 Kotlin 字节码,因此在这种情况下您在其输出中看到的内容并不能反映实际发生的情况。实际上,空的 lambda 将被编译为实现相应FunctionN接口的单例嵌套类,其主体为空,并且单例实例将用作默认值。

有关如何在 Kotlin 中实现默认参数的更多信息,请参阅我的演讲幻灯片。

于 2016-08-05T16:11:31.827 回答
9

查看暴露函数的最后一个参数:

internal fun showDialog(title: String, message: String? = null, okButtonAction: () -> Unit, koButtonAction:() -> Unit = {}) { //do things..... }
于 2018-06-13T08:41:02.873 回答