null或空lambda作为默认值

Paw*_*ski 10 lambda decompiling kotlin jvm-bytecode

哪种解决方案更好?使用nullable 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视为默认值?

yol*_*ole 14

传递一个空的lambda而不是null作为lambda参数的默认值肯定更惯用.

IntelliJ IDEA中使用的反编译器并不总是特别好地处理Kotlin字节码,因此在这种情况下你在输出中看到的并不反映实际发生的情况.实际上,空lambda将被编译为单个嵌套类,实现FunctionN具有空体的相应接口,并且单例实例将用作默认值.

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

  • 如何检查lambda是否为空? (4认同)

Cat*_*luc 9

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

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