2011-10-09 9 views
5

पर मेटाडेटा संलग्न करना क्या क्लोजर जेन-क्लास में मेटाडेटा संलग्न करना संभव है?क्लोजर जेन-क्लास

मैं ऐसे सर्वर को लागू करने की कोशिश कर रहा हूं जो लाइब्रेरी का उपयोग करता है जिसके लिए कक्षाओं में जावा एनोटेशन की आवश्यकता होती है।

चास एमेरिक, एट अल।, आगामी पुस्तक "प्रोग्रामिंग क्लोजर" (सेक्शन 9.7.3) से, जेन-क्लास विधियों में एनोटेशन जोड़ना आसान है, लेकिन कक्षा-स्तर एनोटेशन जोड़ने का कोई उल्लेख नहीं है।

उत्तर

2

मुझे नहीं लगता कि यह इस समय संभव है।

रिच हिक्की एनोटेशन इस सूत्र https://groups.google.com/group/clojure/browse_thread/thread/d2128e1505c0c117 में समर्थन लेकिन जहां तक ​​मैं देख सकता हूँ यह केवल deftype/defrecord के लिए है जोड़ने का उल्लेख है। हो सकता है मै गलत हूँ।

इन

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

की

दोनों और

(ns genclass.example) 

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

मेरे लिए संकलित करने के लिए असफल। अपवाद से

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

ऐसा लगता है कि यह संभव नहीं है।

+1

चास की पुस्तक में उदाहरण के बाद, मैंने अपने जेएक्स-आरएस रीस्ट सर्वर के लिए 'जेन-क्लास' के बजाय 'डेफटाइप' का उपयोग करना शुरू कर दिया है। यह "क्लीनर" प्रतीत होता है। – Ralph

+0

आपको चास द्वारा निम्न फ्लोचार्ट भी पसंद हो सकता है: http://cemerick.com/2011/07/05/flowchart-for-choosing-the-right-clojure-type-definition-form/ यह हो सकता है उनकी पुस्तक, मेरे पास अभी तक यह नहीं है ... – Paul

+0

मैंने फ्लोचार्ट देखा जब यह पहली बार ट्विटर पर दिखाई दिया। बहुत अच्छा! धन्यवाद। – Ralph

19

हाँ, यह है, मैं यहाँ एक महान उदाहरण पाया:

(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

के लिए अतिरिक्त जानकारी जोड़ने के लिए:

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

यहाँ कुछ inlined तो यह भविष्य में गायब नहीं होता कोड है ऐसा इसलिए क्योंकि मुझे इसे कहीं और दस्तावेज नहीं मिला है, साथ ही रचनाकारों को एनोटेशन जोड़ना भी संभव है।

आप कन्स्ट्रक्टर जोड़ी की पहली सरणी में मेटा डेटा जोड़कर रचनाकारों को एनोटेशन जोड़ सकते हैं। इस तरह:

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