默认值为null或空lambda

默认值为null或空lambda,lambda,kotlin,decompiling,jvm-bytecode,Lambda,Kotlin,Decompiling,Jvm Bytecode,哪种解决方案更好?使用可空lambda或传递空lambda作为默认参数?科特林会以某种方式优化空lambda吗?或者创建一个不做任何事情的新实例 classtest1(val操作:()->Unit={}) 不幸的是,我不理解生成的字节码。让我们分析一下 val test11=Test1() 反编译后会给我们 private static final Test1 test11=newtest1((Function0)null,1,(DefaultConstructorMarker)null) 最后

哪种解决方案更好?使用可空lambda或传递空lambda作为默认参数?科特林会以某种方式优化空lambda吗?或者创建一个不做任何事情的新实例

classtest1(val操作:()->Unit={})

不幸的是,我不理解生成的字节码。让我们分析一下

val test11=Test1()

反编译后会给我们

private static final Test1 test11=newtest1((Function0)null,1,(DefaultConstructorMarker)null)

最后,当一个lambda被传递时,就像这样

var1=(Function0)null.INSTANCE

编辑:
隐藏的问题是:Kotlin如何将空lambda视为默认值?

传递空lambda而不是null作为lambda参数的默认值显然更为惯用

IntelliJ IDEA中使用的反编译器并不总是能够很好地处理Kotlin字节码,因此您在本例中看到的输出并不反映实际发生的情况。实际上,空lambda将被编译成一个单例嵌套类,该类实现了具有空主体的相应
function n
接口,单例实例将用作默认值


有关如何在Kotlin中实现默认参数的更多信息,请参阅。

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

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

哪种解决方案更好取决于您试图实现或优化的目标?我不希望有不必要的空实例。我知道最简单的解决方案是使用可为空的lambda,但这意味着丑陋的构造
action?.invoke()
@PawełByszewski您对
类Test1(val action:()->Unit={})
?您在两个主观答案之间征求意见。因此,答案是您的问题:如果您喜欢处理null,请使用null;如果您希望在缺少值时具有空行为,请使用empty。同样的问题可能会被问到“我应该有一个空列表还是空列表?”答案是相同的“这取决于你”这两个解决方案在我看来都很臭。为什么不能有两种不同的类型:一种有动作,另一种没有动作?您可能需要使用继承和/或委派来重用某些代码。您甚至可以将
action
作为抽象函数而不是属性。我怀疑你的代码会更干净。如何检查lambda是否为空?@Sunstrike没有办法。“你为什么认为你需要这个?”提出了一个问题,很可能在这里找到了solutionKotlin新手。设置一个空的lambda(对于一个保存lambda内容的变量)“仅仅因为在我处理完lambda之后释放资源”是愚蠢的吗?传递一个空的lambda肯定更为惯用——我不同意。由于在kotlin中,nullability是一个一级公民,并且是缺少值的明确指示,因此我将传递null作为默认参数。它还有一个优点,即它可以很容易地检查和处理,并且您不希望lambda做一些有用的事情,特别是对于具有返回值的lambda。