es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Se puede garantizar que las expresiones lambda de Java no mantendrán una referencia a `this`?

Si una expresión lambda no se refiere a ningún método o campo de la instancia circundante, ¿garantiza el lenguaje que no tiene una referencia a this?

En particular, quiero usar expresiones lambda para implementar acciones de java.lang.ref.Cleaner. Por ejemplo:

import static some.Global.cleaner;

public class HoldsSomeResource {
    private final Resource res;
    private final Cleanable cleanup;

    public HoldsSomeResource(Resource res) {
        this.res = res;
        cleanup = cleaner.register(this, () -> res.discard());
    }

    public void discard() {
        cleanup.clean();
    }
}

Claramente, sería malo si la expresión lambda que implementa la acción de limpieza tuviera una referencia a this, ya que nunca se volvería inalcanzable. Parece funcionar cuando lo pruebo ahora mismo, pero no puedo encontrar la referencia obvia en la JLS que garantice que sea seguro, así que estoy un poco preocupado de que pueda tener problemas en implementaciones alternativas y/o futuras de Java.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Según la Especificación del Lenguaje Java, si una expresión lambda no hace referencia a ningún método o campo de la instancia circundante, se trata como una “expresión lambda sin estado” y no tiene una referencia a this. Por lo tanto, en el código de ejemplo proporcionado, la expresión lambda que implementa la acción de limpieza no debe tener una referencia a la instancia de HoldsSomeResource.

    Sin embargo, cabe señalar que este comportamiento no está garantizado explícitamente en la especificación del lenguaje y puede variar en implementaciones alternativas o futuras de Java.

Comments are closed.