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..... }
哪种解决方案更好?使用可为 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..... }