Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


¿Los lambdas en el compilador de lazo de Android N tienen referencias a la clase de inclusión?

A diferencia de las clases internas anónimas, las lambdas de Java 8 no contienen referencias a la clase enclosing (parent). Android N agrega soporte para lambdas.

Sin embargo, se implementan en el compilador Jack utilizando clases internas anónimas para compatibilidad con versiones anteriores, como indica la nota en el enlace.

¿Significa esto que las lambdas en las clases de Android compiladas usando Jack (y no retrolambda) contendrán referencias a la clase inclusiva?

Sé que una razón por la que mucha gente estaba entusiasmada con lambdas es evitar fugas de Fragment o Activity al usarlas, pero a primera vista, parece que usar el compilador jack no dará ese beneficio.

  • Filtra una lista de objetos en Android usando gradle-retrolambda y Lightweight-Stream-API
  • No se puede usar forEach y lambda en android min sdk versión menos de 24
  • Java.lang.NoClassDefFoundError $$ inlined $ forEach $ lambda $ 1 en Kotlin
  • Android Jack: Lambda que viene del archivo jar necesita sus interfaces en el classpath para ser compilado, las interfaces desconocidas son java.util.function.Consumer
  • Androide retrolambda, la sentencia lambda puede ser reemplazada por la expresión lambda
  • Unidad Método de prueba que no contiene lambda expresión Android Studio
  • Expresiones Lambda en android
  • Las expresiones Lambda se bloquean con IncompatibleClassChangeError en Android cuando se usa jack
  • One Solution collect form web for “¿Los lambdas en el compilador de lazo de Android N tienen referencias a la clase de inclusión?”

    Creo que la frase "clase anónima" no debe interpretarse demasiado literalmente aquí. En mi entendimiento, lo único que quieren decirnos es que Jack genera las clases en tiempo de compilación (en contraposición al enfoque de tiempo de ejecución de Java 8).

    Del código de JackIrBuilder adivinaría que el IR generado parece muy similar al bytecode que sería generado por retrolambda.

    Jack parece crear un método sintético que contiene el cuerpo lambda en el tipo de inclusión y pasa la referencia de la instancia de inclusión al constructor de la clase generada sólo en aquellos casos en los que es necesario, es decir, cuando se capturan los miembros de la instancia de inclusión.

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

    Por lo tanto, por lo que entiendo, la respuesta es: sólo cuando algo tiene que ser capturado de la instancia de inclusión.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.