No hay nada difícil en convertir clases de método único para los punteros a la función, pero le falta una cosa: las expresiones lambda no son solo funciones, son cierres. La diferencia es que los cierres pueden capturar variables externas. Considere siguiente ejemplo en seudo Java:
public Adder makeAdder(double startNumber) {
return #{ int number -> number + startNumber}
}
...
int startNumber = 5;
Adder add5 = makeAdder(startNumber);
add5.invoke(4); // ==> 9
En esta función ejemplo lambda, producido por la llamada a makeAdder(), se refiere a la variable que se define fuera de este lambda. Es por eso que se llama "cierres": están "cerrados" sus variables libres (en este caso, sobre el número de inicio). Para manejar tales situaciones, los cierres deben contener tanto el puntero a una función como el puntero a su entorno . Entonces, obtienes una estructura de datos que tiene un método y al menos una variable. Pero, ¿no es una definición de objeto en OOP? Entonces, ¿cuál es el motivo para crear nuevos tipos de objetos si puede convertirlos en una instancia de clase anónima?
Sin embargo, se pueden realizar algunas otras optimizaciones en clases anónimas. El documento de trabajo que usted mencionó menciona algunos de ellos, por ejemplo, inferir y usar efectivamente variables finales (aunque esto se hace principalmente para permitir el uso de lambdas en JVM en principio, no para optimizar el código). La clase anónima producida también puede finalizarse, y la mayoría de las JVM ya tienen buenas optimizaciones para los vars y las clases finales.
Otras mejoras también pueden referirse a las referencias al medio ambiente: hay muchas opciones allí.
Cuando dices "puntero a la función", ¿te refieres a un simple puntero al principio del código de la función? – ffriend
@ffriend - Sí, lo hago.Sé que hay algunos problemas con este enfoque, por ejemplo, es posible sincronizar en un objeto. Pero la JVM también puede hacer otras optimizaciones no triviales, por ejemplo, en la creación de métodos virtuales. –