2015-08-30 3 views
12

से उपयोग के लिए प्रोटोकॉल और डिफ्रॉर्ड्स की लाइब्रेरी बनाना इस समय, मेरे पास जावा से एक पूरी तरह से कार्यात्मक क्लोजर लाइब्रेरी है जिसे कॉल किया जाता है।जावा

जिस तरह से मैं यह करता हूं: मेरे पास एक फ़ाइल है जो पूरे एपीआई को एक वर्ग के स्थिर तरीकों के रूप में लपेटने के लिए जेन-क्लास का उपयोग करती है और आईपर्सिस्टेंट वेक्टर और आईपर्सिस्टेंट मैप के रूप में डेटा को अंदर और बाहर पास करती है।

अब, मैं लाइब्रेरी को दोबारा कर रहा हूं और विभिन्न प्रोटोकॉल के पीछे कार्यक्षमता डाल रहा हूं।

मैं चार प्रोटोकॉल है की सुविधा देता है, उन्हें ए, बी, सी और डी और दो defrecords, एक्स और वाई एक्स और वाई फोन दोनों प्रोटोकॉल एक को लागू, बी और सी वाई भी डी

लागू करता है जबकि जावा में उपलब्ध कराने के लिए मुझे क्या करने की ज़रूरत है? क्या ये स्वचालित रूप से इंटरफेस और कक्षाओं के रूप में उपलब्ध हैं? या क्या मुझे अभी भी जनता बनाने के लिए जेन-क्लास के बराबर करना है?

यदि नहीं, तो जेन-क्लास के बराबर क्या है: विधियों का खंड, जहां मैं विधियों के लिए जावा प्रकारों को परिभाषित करता हूं?

क्या किसी के पास जावा में प्रोटोकॉल और रिकॉर्ड उपलब्ध कराने का एक सरल उदाहरण है?

उत्तर

6

defprotocol

हर Clojure प्रोटोकॉल भी एक ही नाम और तरीकों के साथ एक जावा इंटरफेस है। अगर मैं ibm developerworks से एक उदाहरण लेते हैं, हम देखते हैं कि:

(ns com.amalgamated) 

(defprotocol Fulfillment 
    (invoice [this] "Returns an invoice") 
    (manifest [this] "Returns a shipping manifest")) 

के बराबर है:

package com.amalgamated; 

public interface Fulfillment { 
    public Object invoice(); 
    public Object manifest(); 
} 

Clojure.org भी कुछ (बल्कि संक्षिप्त) इस बारे में जानकारी नहीं है।

प्रोटोकॉल में भाग लेने के लिए देख रहे एक जावा क्लाइंट प्रोटोकॉल से उत्पन्न इंटरफ़ेस को कार्यान्वित करके कुशलतापूर्वक कर सकता है। प्रोटोकॉल के विदेश कार्यान्वयन (जो जब आप एक वर्ग चाहते हैं या अपने नियंत्रण प्रोटोकॉल में भाग लेने के लिए नहीं टाइप की जरूरत है) का विस्तार निर्माण का उपयोग कर उपलब्ध कराया जा सकता:

(extend AType AProtocol 
{:foo an-existing-fn 
    :bar (fn [a b] ...) 
    :baz (fn ([a]...) ([a b] ...)...)} BProtocol 
    {...} ...) 

definterface

यदि आप प्रदर्शन का लक्ष्य रखते हैं, तो आप definterface का उपयोग करने पर विचार कर सकते हैं, जो उपयोग प्रोटोकॉल के समान है। यह SO post भी इसे उपयोग करने के बारे में विवरण दिया गया है:

(definterface Foo 
    [^int foo [x ^String y]] 
    [^void bar [^ints is]]) 

definterface प्रोटोकॉल से faster होने लगते हैं।

defrecord

इसी तरह, record रों (और साथ deftype और definterface के रूप में) जावा वर्गों उत्पन्न होगा। फिर, Clojure.org/datatypes उपयोगी जानकारी (जोर मेरा) है:

deftype और defrecord गतिशील, एक दिया क्षेत्रों के एक सेट के साथ वर्ग नामित के लिए संकलित बाईटकोड उत्पन्न और वैकल्पिक रूप से एक के लिए तरीकों या अधिक प्रोटोकॉल और/या इंटरफेस। वे गतिशील और इंटरैक्टिव विकास के लिए उपयुक्त हैं, AOT संकलित की जरूरत नहीं सकता है, और एक ही सत्र के दौरान फिर से मूल्यांकन किया जा सकता है। वे नामित क्षेत्रों के साथ डाटा संरचनाओं को पैदा करने में defstruct के समान हैं, लेकिन उस में defstruct से फ़र्क होता है: [...]

तो हाँ अगर जावा से उपलब्ध हो जाएगा। बस नामकरण के साथ सावधान रहना।

एक तरफ ध्यान दें के रूप में, आप calling Clojure from Java पर एक नजर है कर सकते हैं।