与匿名内部类不同,Java 8 lambda 不保存对封闭(父)类的引用。安卓 N adds support对于 lambda。
但是,它们是在 Jack
编译器中使用匿名内部类实现的,以实现向后兼容性,如链接中的注释所述。
这是否意味着使用 Jack(而不是 retrolambda)编译的 Android 类中的 lambda 将保存对封闭类的引用?
我知道很多人对 lambda 感到兴奋的一个原因是在使用它们时避免 Fragment
或 Activity
泄漏,但粗略地看一下,它看起来像使用 jack
编译器不会提供这种好处。
最佳答案
我认为“匿名类”这个词在这里不应该被过于字面地解释。据我了解,他们唯一想告诉我们的是 Jack 在编译时生成类(与 Java 8 的运行时方法相反)。
根据 JackIrBuilder 代码,我猜测生成的 IR 看起来与 retrolambda 生成的字节码非常相似。
Jack 似乎创建了一个包含封闭类型中的 lambda 主体的合成方法,并且仅在需要的情况下(即捕获封闭实例的成员时)将封闭实例的引用传递给生成的类的构造函数.
因此,据我了解,答案是:仅当需要从封闭实例中捕获某些内容时。
关于android - Android N jack 编译器中的 lambda 是否包含对封闭类的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36271184/