Java doble llave de inicialización vs lambda

everett1992:

Si usted busca la palabra 'java doble llave' encontrará argumentos sólidos en contra de usarlo.

Cada vez que alguien utiliza el doble de inicialización corsé, un gatito muere. https://stackoverflow.com/a/27521360/555631

Los argumentos se va a crear demasiadas clases anónimas y que está creando potencialmente una pérdida de memoria.

Lambdas son diferentes? Cada uno de ellos crean una clase interna anónima, que cada referencia que encierra su cierre.

rgettman:

Las expresiones lambda son diferentes de una clase interna anónima que pasa a implementar una interfaz funcional.

Anónimos clases internas crearán su propio archivo de clase en la compilación, por lo general algo en la línea de Foo$1.class, si está contenida en la Fooclase. Es una clase completamente funcional que implementa una interfaz o subclases de una clase. Para hacer referencia a los valores locales fuera de su alcance, será, por detrás de las escenas, crear una variable de instancia en la clase interna anónima que representa una copia del valor. Esta es la razón por la variable debe ser efectivamente final - de lo contrario la variable real puede cambiar y la copia puede ser rancio.

Las expresiones lambda no crean clases internas anónimas. Utilizan una java.lang.invoke.LambdaMetafactoryque produce una CallSiteque se puede utilizar posteriormente para ejecutar la expresión lambda. La expresión lambda, si se trata de un bloque o una expresión, se convierte en un método estático privada escondido dentro de la clase en la que está contenido. En lugar de crear una clase con una variable oculta, valores capturados se traducen en parámetros del método estático privada escondido. Los valores locales todavía deben ser efectivamente final, ya que el valor pasado al método es de nuevo una copia. El método se invoca por una invokedynamicinstrucción en la JVM.

Fuentes:

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=236617&siteId=1
Recomendado
Clasificación