Roh*_*uva 6 lambda android java-8
与匿名内部类不同,Java 8 lambdas不包含对封闭(父)类的引用.Android N 增加了对lambdas的支持.
但是,它们是在Jack编译器中使用匿名内部类实现的,以实现向后兼容性,如链接中的注释所述.
这是否意味着使用Jack(而不是retrolambda)编译的Android类中的lambdas将保留对封闭类的引用?
我知道很多人对lambdas感到兴奋的一个原因是在使用它们时要避免Fragment或Activity泄漏,但粗略地看一眼,看起来使用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
因此,根据我的理解,答案是:只有当需要从封闭实例中捕获某些内容时.
| 归档时间: |
|
| 查看次数: |
452 次 |
| 最近记录: |