lambda - Null 或空 lambda 作为默认值

标签 lambda kotlin decompiling jvm-bytecode

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

相关文章:

python - 使用 JDBC、Python 和 JayDeBeApi 连接到 Filemaker 数据库

java - 这个深奥的泛型错误是编译器错误还是新限制? (推断类型不符合上限)

android - 如何在android中的rxjava2中进行错误处理

debugging - 反编译 1990 DOS 应用程序

android - 是否可以上传反向工程 APK?

c++ - 使用 lambda 调用的默认函数对象值作为函数参数

python - 在 Markdown 中取消/注释掉 html 标签的巧妙方法

json - 传递类的数据类型

android - 在 Android Studio 中查找重复代码 (Kotlin)

c# - 为什么这个 .dll 在 ILSpy 中有奇怪的字母?