android - Android N jack 编译器中的 lambda 是否包含对封闭类的引用?

标签 android lambda java-8

与匿名内部类不同,Java 8 lambda 不保存对封闭(父)类的引用。安卓 N adds support对于 lambda。

但是,它们是在 Jack 编译器中使用匿名内部类实现的,以实现向后兼容性,如链接中的注释所述。

这是否意味着使用 Jack(而不是 retrolambda)编译的 Android 类中的 lambda 将保存对封闭类的引用?

我知道很多人对 lambda 感到兴奋的一个原因是在使用它们时避免 FragmentActivity 泄漏,但粗略地看一下,它看起来像使用 jack 编译器不会提供这种好处。

最佳答案

我认为“匿名类”这个词在这里不应该被过于字面地解释。据我了解,他们唯一想告诉我们的是 Jack 在编译时生成类(与 Java 8 的运行时方法相反)。

根据 JackIrBuilder 代码,我猜测生成的 IR 看起来与 retrolambda 生成的字节码非常相似。

Jack 似乎创建了一个包含封闭类型中的 lambda 主体的合成方法,并且仅在需要的情况下(即捕获封闭实例的成员时)将封闭实例的引用传递给生成的类的构造函数.

引用:https://android.googlesource.com/toolchain/jack/+/0af676c4779c5b55fb321f491811516f3d74ed93/jack/src/com/android/jack/ir/impl/JackIrBuilder.java

因此,据我了解,答案是:仅当需要从封闭实例中捕获某些内容时。

关于android - Android N jack 编译器中的 lambda 是否包含对封闭类的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36271184/

相关文章:

java - 使用 DateTimeFormatterBuilder 将 String 解析为 LocalDateTime 时如何防止自动生成 'T' 字母

java - 在 forEach 循环之外使用变量

android - 在 RecyclerView android 中禁用项目

java - 在命令模式中使用 lambda

python - 无法将 python 请求库导入 AWS Lambda 函数

c# - 如何将 IQueryable 表达式树转换为 Lambda

java - 是否有任何理由在 Java 8 中重写枚举中的方法

java - 重新打包 .jar 文件

android - 停止未恢复的 Activity - Android

java - 抛出 RecyclerView 后 layout_centerInParent 不工作