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

时间:2016-03-28 21:05:40

标签: android lambda java-8

与匿名内部类不同,Java 8 lambdas不包含对封闭(父)类的引用。适用于lambdas的Android N adds support

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

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

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

1 个答案:

答案 0 :(得分:5)

我认为“匿名类”这个短语不应该在字面上解释得太多。根据我的理解,他们唯一要告诉我们的是Jack在编译时生成类(而不是Java 8的运行时方法)。

从JackIrBuilder代码我猜测生成的IR看起来非常类似于retrolambda生成的字节码。

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

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

因此,根据我的理解,答案是:只有在需要从封闭实例中捕获某些内容时才会这样做。