默认值为Null或空lambda



哪种解决方案更好?使用可为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将被编译为一个单例嵌套类,该类实现了具有空主体的相应FunctionN接口,并且单例实例将用作默认值。

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

查看公开函数的最后一个参数:

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

相关内容

  • 没有找到相关文章

最新更新