2011-04-29 14 views
13

में जावा कक्षाएं बनाने के विकल्प क्लोजर में जावा क्लास बनाने के कुछ अलग-अलग तरीके हैं, तो क्लोजर में gen-class, proxy और reify के बीच चुनते समय ट्रेडऑफ क्या हैं? (क्या जावा क्लास बनाने के अन्य तरीके हैं जिन्हें मैंने सूचीबद्ध नहीं किया है?)क्लोजर

मेरी मूल समझ यह है कि मैंने इन संरचनाओं को शक्ति के आदेश में कमी के रूप में सूचीबद्ध किया है।

उत्तर

18

gen-class का उपयोग करें जब आप एक नामित कक्षा चाहते हैं या आप अपनी वस्तुओं को बनाने के लिए नए तरीके जोड़ना चाहते हैं। gen-class एओटी संकलन पर निर्भर करता है।

जब आप एक अज्ञात चाहते हैं, तो एक प्रकार का एक-ऑफ कार्यान्वयन जिसे आप reify या proxy का उपयोग करते हैं। वे एओटी संकलन पर भरोसा नहीं करते हैं। यहाँ उनके अंतर हैं:

  1. reify केवल प्रोटोकॉल या इंटरफेस का समर्थन करता है, proxy भी ठोस सुपर-क्लास का समर्थन करता है।
  2. reify वास्तविक वर्ग विधियों का उपयोग करता है, proxy बाहरी कार्यों का उपयोग करता है।
  3. # 2, reify के कारण प्रत्यक्ष विधि लुकअप का उपयोग करता है, जबकि proxy विधि लुकअप के लिए मानचित्र का उपयोग करता है।
  4. # 3, reify की वजह से विधियों के गतिशील स्वैपिंग का समर्थन नहीं करता है, लेकिन proxy करता है।

reifyproxy की तुलना में बेहतर प्रदर्शन करेंगे, ताकि आप हमेशा जब संभव reify उपयोग करना चाहिए। केवल proxy का उपयोग करें जब reify की बाधाएं बहुत निषिद्ध हैं।

10

जेन-क्लास, प्रॉक्सी और रीफाई के अलावा, हमारे पास defrecord और deftype है। ये बाद के दो विकल्प नामित जावा वर्गों (और डिफ्रेकॉर्ड के मामले में, नामित घटकों के साथ किसी भी प्रकार की संरचना के लिए आपकी पहली पसंद के निर्माण के लिए आपका पहला विकल्प होना चाहिए।)

datatypes page on clojure.org इस विषय पर एक अच्छा संदर्भ है । Defrecord, deftype और reify जीन-क्लास और प्रॉक्सी से नए हैं, जिन्हें संस्करण 1.2 में पेश किया गया है (मुझे लगता है - संभवतः 1.1)। Defrecord और deftype दोनों कक्षाएं बनाते हैं जो इंटरफेस के अनुरूप हैं, लेकिन विरासत की अनुमति नहीं देते हैं। यदि आपको विरासत की आवश्यकता है, तो जीन-क्लास (और अनाम कक्षाओं के लिए प्रॉक्सी) अभी भी आपका एकमात्र विकल्प है।

Defrecord और deftype आपको जो कुछ भी मुफ्त में दिया गया है उससे अलग है। Defrecord स्वचालित रूप से एक वर्ग बनाता है जो IPersistentMap और ISeq के अनुरूप है। दूसरी तरफ, डेफ्टाइप, आपको अपनी कक्षा पर अधिक नियंत्रण देता है, यहां तक ​​कि उत्परिवर्तनीय फ़ील्ड (डिफ्रेकॉर्ड में अनुमति नहीं है) की इजाजत देता है। आम तौर पर, डेफटाइप डेटा संरचनाओं के निम्न-स्तरीय कार्यान्वयन के लिए है, जबकि डिफ्रेकॉर्ड का उपयोग दिन-प्रति-दिन उपयोग के लिए किया जाता है।