【问题标题】:Kotlin scope functions are actually java anonymous classes?Kotlin 作用域函数实际上是 java 匿名类?
【发布时间】:2020-11-26 13:57:48
【问题描述】:

我目前正在开发一些旧的 Java 编写的 Android 项目,但在 Kotlin 中编写我不太熟悉的新部分。我需要一些方法来解开可空对象(类似于 Swift 中的 if let unwrappedMyVar = myVar else {}),为此我使用 myVar?.let {} 范围函数,它解开 myWar 并在它不为空的情况下执行块。但是现在我真的很好奇这些作用域函数是如何在 Kotlin 中实现的,实际上是编译成 Java 匿名类的吗?如果是这样,那么它可能会导致与 Java 匿名类相同的问题。并且很容易造成泄漏
谢谢!
亲切的问候,
Andre

【问题讨论】:

  • 他们不是,你所说的对象在生成的字节码上不存在。该函数只是在调用站点被复制,有效地减少了所有的性能开销。阅读更多关于他们的信息Inline Functions
  • 顺便说一句,在 Kotlin 中,您不会在这种情况下谈论“解包”变量。只是在let()内,编译器知道该值不能为null。 (它在类型中表达了这一点:如果原始值是可空的String?,则结果将是不可空的String。)  这称为smart-casting

标签: java kotlin jvm


【解决方案1】:

letapplyrunalso 等作用域函数以及 Kotlin 标准库中的更多函数是 inline functions,这意味着您传递给的 lambda它们被内联在他们的身体中,然后转换后的身体在调用站点被内联。

使用作用域函数,生成的字节码几乎等同于仅声明一个变量并在显式if-null-check 之后使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-18
    • 2011-12-11
    • 2019-01-24
    • 2011-03-11
    • 2017-08-13
    • 2011-09-10
    • 1970-01-01
    • 2011-12-15
    相关资源
    最近更新 更多