2012-06-13 7 views
12

¿Cuál es la diferencia entre proxy y reify? Tengo un código de ejemplo:¿Cuál es la diferencia entre proxy y reify?

(.listFiles (java.io.File. ".") 
    (proxy 
    [java.io.FileFilter] [] 
    (accept [f] 
     (.isDirectory f)))) 

(.listFiles (java.io.File. ".") 
    (reify 
    java.io.FileFilter 
    (accept [this f] 
     (.isDirectory f)))) 

el resultado es el mismo, cuando el uso del proxy o reificar, lo que es mejor?

Actualización:

he encontrado algo:

  • de proxy sin necesidad del this como primer parámetro.
  • proxy support superclass.
  • argumentos de soporte de proxy.

Respuesta

17

De Clojure.org's overview of data types:

El método cuerpos de reify son cierres léxicos, y pueden referirse al ámbito local circundante. reify difiere de proxy en que:

  • Solamente los protocolos o interfaces son compatibles, sin superclase concreto.
  • Los cuerpos de método son métodos verdaderos de la clase resultante, no fns externos.
  • La invocación de métodos en la instancia es directa, no utilizando la búsqueda del mapa.
  • No se admite el intercambio dinámico de métodos en el mapa de métodos.

El resultado es un mejor rendimiento que proxy, tanto en la construcción como en la invocación. reify es preferible a proxy en todos los casos donde sus restricciones no son prohibitivas.

Fuente: http://clojure.org/datatypes

+0

gracias, debería haber leído los documentos clojure con mayor precisión –

Cuestiones relacionadas