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