哪种解决方案更好?使用可为空的 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 字节码,因此在这种情况下您在其输出中看到的内容并不能反射(reflect)实际发生的情况。实际上,空的 lambda 会被编译成一个单例嵌套类,实现对应的空主体 FunctionN
接口(interface),单例实例将作为默认值。
见 my talk slides有关如何在 Kotlin 中实现默认参数的更多信息。
关于lambda - Null 或空 lambda 作为默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38784939/