Null 或空 lambda 作为默认值

Null or empty lambda as default value

哪种解决方案更好?使用可为 null 的 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 视为默认值?

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

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

有关如何在 Kotlin 中实现默认参数的详细信息,请参阅 my talk slides

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

internal fun showDialog(title: String, message: String? = null, okButtonAction: () -> Unit, koButtonAction:() -> Unit = {}) { //do things..... }