2011-10-09 5 views
5

È possibile allegare metadati a una classe gen Clojure?Collegamento di metadati a una classe gen Clojure

Sto cercando di implementare un server che utilizza una libreria che richiede annotazioni Java aggiunte alle classi.

Da Chas Emerick's, et al., Libro di prossima uscita "Programming Clojure" (sezione 9.7.3), aggiungere annotazioni ai metodi di classe gen è facile, ma non si fa menzione di aggiungere annotazioni a livello di classe.

risposta

2

Non credo sia possibile a questo punto.

Rich Hickey menziona l'aggiunta di annotazioni supportano in questa discussione https://groups.google.com/group/clojure/browse_thread/thread/d2128e1505c0c117 ma per quanto posso vedere questo è soltanto per DEFTYPE/defrecord. Naturalmente potrei sbagliarmi.

Entrambi questi

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

e

(ns genclass.example) 

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

non riescono a compilare per me. Dall'eccezione

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

Sembra che questo non sia possibile.

+1

ho iniziato ad usare 'deftype' invece di' Gen-class' per il mio JAX-RS REST Server, seguendo l'esempio nel libro di Chas. Sembra essere "più pulito". – Ralph

+0

Potrebbe piacerti anche il seguente diagramma di flusso, anche di Chas: http://cemerick.com/2011/07/05/flowchart-for-choosing-the-right-clojure-type-definition-form/ Potrebbe essere in il suo libro, non ce l'ho ancora ... – Paul

+0

Ho visto il diagramma di flusso quando è arrivato per la prima volta su Twitter. Molto carino! Grazie. – Ralph

19

Sì, lo è, ho trovato un grande esempio qui:

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

Ecco po 'di codice inline in modo che non scompare in 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

per aggiungere ulteriori informazioni alla questo perché non riesco a trovarlo documentato altrove è possibile aggiungere annotazioni anche ai costruttori.

È possibile aggiungere annotazioni ai costruttori aggiungendo metadati al primo array della coppia di costruttore. Come questo:

(gen-class 
    :name "FooClass" 
    :init "init" 
    :constructors {^{Inject {}} [Configuration] []} 
    :state "state" 
    :implements [FooInterface] 
    :prefix "ref-")