2011-04-29 16 views
13

Existen algunas maneras diferentes de crear clases Java en Clojure, entonces, ¿cuáles son las ventajas y desventajas al elegir entre gen-class, proxy y reify en Clojure? (¿hay otras formas de crear clases de Java que no he enumerado?)Opciones para crear clases Java en Clojure

Mi comprensión básica es que he enumerado estas construcciones en orden decreciente de potencia.

Respuesta

18

Utilice gen-class cuando desee una clase con nombre o si desea agregar nuevos métodos a los objetos que cree. gen-class se basa en la compilación AOT.

Cuando desee una implementación anónima y única de un tipo, utilice reify o proxy. No se basan en la compilación de AOT. Aquí están sus diferencias:

  1. reify sólo es compatible con los protocolos o interfaces, proxy también es compatible con las superclases de hormigón.
  2. reify utiliza métodos de clase verdadera, proxy utiliza funciones externas.
  3. Debido a # 2, reify utiliza la búsqueda directa de métodos, mientras que proxy usa un mapa para la búsqueda de métodos.
  4. Debido a # 3, reify no es compatible con el intercambio dinámico de métodos, pero proxy sí lo hace.

reify se obtienen mejores resultados que proxy, por lo que siempre debe utilizar reify cuando sea posible. Solo use proxy cuando las restricciones de reify sean demasiado prohibitivas.

10

Además de gen-class, proxy y reify, tenemos defrecord y deftype. Estas dos últimas opciones deberían ser sus primeras opciones para la creación de clases java nombradas (y en el caso de defrecord, su primera elección para cualquier clase de estructura con componentes nombrados).

La datatypes page on clojure.org es una buena referencia sobre este tema . Defrecord, deftype y reify son más nuevos que gen-class y proxy, y se introdujeron en la versión 1.2 (creo, posiblemente 1.1). Defrecord y deftype crean clases que se ajustan a las interfaces, pero no permiten la herencia. Si necesita herencia, gen-class (y proxy para clases anónimas) sigue siendo su única opción.

Defrecord y deftype difieren en lo que se le da de forma gratuita. Defrecord crea automáticamente una clase que se ajusta a IPersistentMap e ISeq. Deftype, por otro lado, le da más control sobre su clase, incluso permitiendo campos mutables (no permitido en defrecord). En general, deftype está destinado a la implementación de bajo nivel de las estructuras de datos, mientras que defrecord está destinado a la mayoría del uso diario.