与匿名内部类不同,Java 8 lambdas不包含对封闭(父)类的引用。适用于lambdas的Android N adds support。
但是,它们是在Jack
编译器中使用匿名内部类实现的,以实现向后兼容性,如链接中的注释所述。
这是否意味着使用Jack(而不是retrolambda)编译的Android类中的lambdas将保留对封闭类的引用?
我知道很多人对lambdas感到兴奋的一个原因是在使用它们时要避免Fragment
或Activity
泄漏,但粗略地看一下,看起来好像使用jack
编译器会不给那个好处。
答案 0 :(得分:5)
我认为“匿名类”这个短语不应该在字面上解释得太多。根据我的理解,他们唯一要告诉我们的是Jack在编译时生成类(而不是Java 8的运行时方法)。
从JackIrBuilder代码我猜测生成的IR看起来非常类似于retrolambda生成的字节码。
Jack似乎创建了一个包含封闭类型的lambda主体的合成方法,并且仅在需要它的情况下将封闭实例的引用传递给生成的类'构造函数,即当封闭实例的成员被捕获时
因此,根据我的理解,答案是:只有在需要从封闭实例中捕获某些内容时才会这样做。