¿Por qué una lambda necesita capturar la instancia de cierre cuando hace referencia a un campo de cadena final?

Esto se basa enesta pregunta. Considere este ejemplo donde un método devuelve unConsumer basado en una expresión lambda:

public class TestClass {
    public static void main(String[] args) {
        MyClass m = new MyClass();
        Consumer<String> fn = m.getConsumer();

        System.out.println("Just to put a breakpoint");
    }
}

class MyClass {
    final String foo = "foo";

    public Consumer<String> getConsumer() {
        return bar -> System.out.println(bar + foo);
    }
}

Como sabemos, no es una buena práctica hacer referencia a un estado actual dentro de un lambda cuando se realiza una programación funcional, una razón es que el lambda capturaría la instancia de cierre, que no se recolectará basura hasta que el lambda esté fuera del alcance.

Sin embargo, en este escenario específico relacionado confinal cadenas, parece que el compilador podría haber encerrado la constante (final) cuerdafoo (del grupo constante) en la lambda devuelta, en lugar de encerrar el conjuntoMyClass instancia como se muestra a continuación durante la depuración (colocando la ruptura en elSystem.out.println) ¿Tiene que ver con la forma en que las lambdas se compilan para un especialinvokedynamic bytecode?

Respuestas a la pregunta(4)

Su respuesta a la pregunta