2010-07-02 14 views

Respuesta

5

Ellos no son tan mismo. Ambos crean clases sin nombre, pero su similitud termina en ese punto.

En C++ se crea un cierre de la captura de sus variables locales, opcionalmente por referencia. En Java, solo obtiene una instantánea de los valores de la variable local actual (y esas variables deben ser "definitivas").

El propósito de clases internas anónimas es extender otra clase o implementar otra interfaz ad-hoc. Por esa razón, las clases internas anónimas pueden simular el trabajo de las expresiones lambda en cierta medida, por ejemplo implementando la interfaz Runnable. Las expresiones Lambda están específicamente diseñadas para ser llamadas y posiblemente modificar las variables locales en su entorno.

+0

Excepto el acceso a las variables en el alcance no hay diferencia ¿no? – yesraaj

+1

@yesraaj, no conozco los detalles de las clases internas. Pero dado que el propósito es completamente diferente, creo que no podemos compararlos usando métodos sanos. En clases internas anónimas, lo que especifica en el cuerpo se copia en el cuerpo de clase sin nombre que se genera. Entonces puede agregar múltiples métodos, miembros de la clase, etc. Para C++ lambdas, solo debe especificar el contenido del "operador()". –

+0

+1. Como nota al margen, C# proporciona otro enfoque diferente al problema de los cierres con sus propias lambdas que siempre capturan por referencia todas las variables locales. Puede leer sobre Java/C# en [The Beauty of Closures] (http://csharpindepth.com/Articles/Chapter5/Closures.aspx) en el blog de Jon Skeet. El artículo no trata con C++ lambdas, donde puedes capturar por valor o por referencia, pero como en la mayoría de los otros casos en C++, debes tener cuidado con la vida de tus referencias capturadas: la lambda no se debe usar después de la referencia. los objetos han sido destruidos –

2

C++ 0x lambda expresiones son métodos no identificadas, Javas clases anónimas son clases sin nombre. Entonces comparten el no tener un nombre, pero los conceptos son diferentes.

Empezando por el hecho más evidente, que las funciones lambda (mayo) y devolver un valor clases anónimas se pueden utilizar para crear instancias (objetos).

BTW - wikipedia menciona que solo las funciones de lambda se han propuesto para C++ 0x.

+0

usando el método word es un poco extraño, las expresiones lambda no son métodos anónimos, son funciones anónimas . –

+0

@snk_kid: En C++, son lo mismo. Las funciones de clase son métodos miembros. – Puppy

+0

@DeadMG Los métodos de instancia no son lo mismo que una función, especialmente en el significado tradicional/original de la palabra de idiomas como Smalltalk y Objective-C. Los métodos son terminología OO, no son cálculo lambda o terminología de programación funcional, no hay 'métodos' en lenguajes funcionales como Haskell o SML. Así que como dije usar el método de palabra es engañoso e incorrecto. –

4

A Java clase interna anónima puede referirse a final datos en el método de cerramiento, y para todos los datos (incluyendo mutable) en la clase envolvente. Entonces los métodos en clases anónimas no pueden cambiar los valores de las variables en el método adjunto, pero pueden cambiar los valores de los miembros en la clase adjunta.

A C++ lambda puede referirse a todos datos (incluyendo mutable) en la función de cerramiento, y si está anidada dentro de una función miembro entonces se puede hacer lo mismo para los datos de la clase envolvente. El programador declara el grado preciso de dependencia en el (los) ámbito (s) adjunto (s), por lo que es explícito y no implícito.

Esto los hace bastante similares pero la característica Java trata las variables/parámetros locales en métodos diferentes, sobre el principio de que no deberían ser mutables desde fuera del método, especialmente en un lenguaje que tradicionalmente ha empleado el subprocesamiento de manera casual.

Comparar con C# lambdas, que no tienen restricciones y todas las dependencias están implícitas. Esto los hace de lejos la menos detallada de estas características (también ayudadas por tener la mejor inferencia de tipo). Pero a la baja, invalidan todas las reglas simples sobre el subprocesamiento, es decir, ya no es necesariamente cierto que las variables locales están "en la pila de subprocesos" y, por lo tanto, nunca requieren bloqueo antes del acceso.

+0

Greate respuesta.¿Tiene algún recurso específico que pueda utilizar para conocer mejor los detalles (y tal vez la implementación) de las funciones de java lambda? –

Cuestiones relacionadas