2011-10-09 15 views
5

¿Es posible adjuntar metadatos a una clase gen de Clojure?Adjuntar metadatos a una clase de gen Clojure

Estoy tratando de implementar un servidor que usa una biblioteca que requiere anotaciones Java agregadas a las clases.

De Chas Emerick's, et al., Próximo libro "Programación Clojure" (sección 9.7.3), agregar anotaciones a los métodos gen-class es fácil, pero no se menciona la adición de anotaciones a nivel de clase.

Respuesta

2

No creo que sea posible en este momento.

Rich Hickey menciona la adición de anotaciones apoyan en este hilo https://groups.google.com/group/clojure/browse_thread/thread/d2128e1505c0c117 pero por lo que puedo ver esto es sólo para DEFTYPE/defrecord. Podría estar equivocado, por supuesto.

Ambos

(ns genclass.example 
    (:gen-class ^{:doc "example class"})) 

y

(ns genclass.example) 

(with-meta 
    (gen-class 
    :name genclass.example.ClassA 
    :methods [[hello [] void]]) 
    {:doc "Example class"})  

fallan para compilar para mí. De la excepción

Exception in thread "main" java.lang.IllegalArgumentException: Metadata can only be applied to IMetas (example.clj:4)` 

Parece que esto no es posible.

+1

Comencé a usar 'deftype' en lugar de' gen-class' para mi JAX-RS REST Server, siguiendo el ejemplo en el libro de Chas. Parece ser "más limpio". – Ralph

+0

También le puede interesar el siguiente diagrama de flujo, también por Chas: http://cemerick.com/2011/07/05/flowchart-for-choosing-the-right-clojure-type-definition-form/ Podría estar en su libro, todavía no lo tengo ... – Paul

+0

Vi el diagrama de flujo cuando apareció por primera vez en twitter. ¡Bastante agradable! Gracias. – Ralph

19

Sí lo es, me encontré con un gran ejemplo aquí:

https://github.com/clojure/clojure/blob/master/test/clojure/test_clojure/genclass/examples.clj

Aquí hay un código inline por lo que no desaparece en el futuro:

(gen-class :name ^{Deprecated {} 
        SuppressWarnings ["Warning1"] ; discarded 
        java.lang.annotation.Target []} 
       clojure.test_clojure.genclass.examples.ExampleAnnotationClass 
      :prefix "annot-" 
      :methods [[^{Deprecated {} 
         Override {}} ;discarded 
         foo [^{java.lang.annotation.Retention java.lang.annotation.RetentionPolicy/SOURCE 
          java.lang.annotation.Target [java.lang.annotation.ElementType/TYPE 
                  java.lang.annotation.ElementType/PARAMETER]} 
          String] void]]) 
1

Para añadir información adicional a esto porque no puedo encontrarlo documentado en ningún otro lugar es posible agregar anotaciones a los constructores también.

Puede agregar anotaciones a los constructores agregando metadatos a la primera matriz del par de constructores. De esta forma:

Cuestiones relacionadas