空或空lambda作为默认值
哪个解决方案比较好? 使用可空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中实施默认参数的更多信息,请参阅我的演讲幻灯片 。