2010-10-20 16 views
5

में प्रत्यारोपण के माध्यम से "मुक्केबाजी" आदिम प्रकारों के ओवरहेड का मानना ​​है कि मैं जावा Date जैसी कक्षा बनाना चाहता हूं।स्कैला

type PrimitiveDate = Long 

तो फिर तुम निहित का उपयोग करके तरीकों जोड़ सकते हैं: इसका एकमात्र डेटा सदस्य एक लंबे जो 1970

के बाद से मिलीसेकंड का प्रतिनिधित्व करता है/यह सिर्फ एक नया स्काला प्रकार बनाने के किसी भी प्रदर्शन लाभ के हो सकता है चाहेंगे है रूपांतरण, जैसे यह RichInt के साथ int के लिए किया जाता है। क्या इस समृद्ध वर्ग में आदिम प्रकार के "मुक्केबाजी" में कोई ओवरहेड (वर्ग निर्माण) शामिल है? मूल रूप से आप सिर्फ एक स्थिर विधि

def addMonth(date: PrimitiveDate, months: Int): PrimitiveDate = date + 2592000000 * months 

है और यह जब d addMonth 5 अपने कोड के अंदर प्रकट होता है लागू करने के लिए है कि प्रकार प्रणाली आंकड़ा बाहर जाने सकता है।

संपादित

ऐसा लगता है कि आप type PrimitiveDate = Long लिख कर बनाने उर्फ ​​स्केला संकलक द्वारा लागू नहीं की है। एक उचित वर्ग बना रहा है, लांग को घेर रहा है, स्कैला में एक लागू प्रकार बनाने का एकमात्र तरीका है?

आदिम प्रकारों के लिए एक लागू प्रकार उपनाम बनाने में सक्षम होने पर आप कितना उपयोगी मानते हैं?

उत्तर

10

खैर, escape analysis मतलब यह होना चाहिए सबसे हाल ही में JVMs वास्तव में आदेश addMonth विधि कॉल करने में अपने अमीर आवरण बनाने के लिए की जरूरत नहीं है कि।

किस हद तक इस वास्तव में अभ्यास में होता है स्पष्ट रूप से एक क्रम हॉटस्पॉट JVM फैसला करता है कि इन तरीकों ऑब्जेक्ट निर्माण में जोड़ रहे हैं कितना पर निर्भर करेगा करने के लिए। जब बचने का विश्लेषण नहीं हो रहा है, तो स्पष्ट रूप से जेवीएम को रैपर वर्ग के एक नए उदाहरण में Long (जैसा कि आप कहते हैं) "बॉक्स" करना होगा। इसमें "वर्ग निर्माण" शामिल नहीं है - इसमें "कक्षा का उदाहरण बनाना" शामिल होगा। इस उदाहरण के लिए, कम समय तक जीवित किया जा रहा है तो जी सी-डी तुरंत होगा, इसलिए भूमि के ऊपर (जबकि छोटे) है:

  • उदाहरण के लिए स्मृति आवंटन
  • जीसी-इंग उदाहरण

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

इस बात के लिए कि दृष्टिकोण आपके लिए काम करेगा या नहीं (विश्लेषण से बचने में आपकी मदद आती है), आपको जंगली में परीक्षण करना होगा। माइक्रो-बेंचमार्क इस तरह की चीज़ के लिए लिखना बेहद मुश्किल है।


कारण मैं नहीं काफी इन प्रकार के उपनाम एक सार्वजनिक एपीआई का हिस्सा होने की तरह है कि स्केला वास्तव में उन्हें सख्ती के रूप में मैं चाहूँगा लागू नहीं करता है है।उदाहरण के लिए:

type PrimitiveDate = Long 
type PrimitiveSpeed = Long 
type Car = String 
type Meeting = String 

var maxSpeeds : Map[Car, PrimitiveSpeed] = Map.empty 

//OOPS - much too easy to accidentally send the wrong type 
def setDate(meeting : Meeting, date : PrimitiveDate) = maxSpeeds += (meeting -> date) 
+0

"लागू एलियास" पर अच्छा बिंदु। यह एक बात थी जिसके बारे में मैं सोच रहा था। तो स्केल में एक प्राचीन प्रकार के लिए उचित प्रकार उपनाम बनाने का कोई तरीका नहीं है? – ziggystar

+1

@ziggystar - नहीं है। मैं दो चीजों में से एक के लिए टाइप उपनाम का उपयोग करता हूं: केविन की निजी आंतरिक सामग्री नीचे की बात करती है; पैकेज ऑब्जेक्ट आयात (यानी 'सूची' अभी भी 'स्कैला' पैकेज में क्यों प्रतीत होता है) –

+0

मुझे लगता है कि माइल्स सबिन एक सुरुचिपूर्ण और कलाकार [समाधान] (https://gist.github.com/milessabin/89c9b47a91017973a35f) के साथ आया था। इस सवाल के 11 महीने बाद पूछा गया। – itsbruce

4

आपने वास्तव में अपने दिए गए उदाहरण में एक नया प्रकार नहीं बनाया है, यह केवल पूर्व-मौजूदा लंबे प्रकार के लिए एक उपनाम है।

यह एक ऐसी तकनीक है जिसका उपयोग मैं अक्सर अनावश्यक नेस्टेड कनेक्शन से निपटने के लिए करता हूं। उदाहरण के लिए, मैं Seq[Seq[Int]] को विभिन्न पैरामीटर के लिए बार-बार निर्दिष्ट करने से बचने के लिए type Grid = Seq[Seq[Int]] उपनाम करता हूं।

आप काफी खुशी से एक विधि एक PrimitiveDate विधि लेने के लिए एक Long पारित कर सकते हैं, हालांकि आप लाभ यह है कि कोड में काफी बेहतर आत्म प्रलेखित है की क्या ज़रूरत है

तुम सच में लागू किया प्रकार- सुरक्षा और सुविधाजनक पैटर्न मिलान के साथ एक नए प्रकार बनाने के लिए चाहते हैं, तो मैं एक मामले वर्ग का उपयोग करेंगे:

case class PrimitiveDate(value:Long) 

और, संभावित, भी प्रदान करते हैं एक अंतर्निहित लांग => सुविधा के लिए PrimitiveDate रूपांतरण।

3

इस प्रश्न से पूछने के 11 महीने बाद, माइल्स सबिन ने स्कैला में unboxed newtypes बनाने का एक बहुत ही सरल, सुरुचिपूर्ण और प्रदर्शन करने वाला तरीका खोजा। प्रकार उपनाम के विपरीत, प्रकार टैग लागू होते हैं। विशेषज्ञता प्रदान करने के लिए आदिम प्रकारों को कम से कम बॉयलरप्लेट (प्रति पंक्ति एक पंक्ति) की आवश्यकता होती है।

एक साल बाद, उन्होंने Shapeless में more polished and robust version जोड़ा। अवधारणा सरल और संक्षेप में एक परियोजना में डुप्लिकेट करने के लिए पर्याप्त है, यदि आप उस उत्कृष्ट पुस्तकालय को नहीं चाहते हैं।

बेशक, आप और आपके प्रश्नों का उत्तर देने वाले दोनों लोग शायद यह जानते हैं, लेकिन यह यहां जोड़ने लायक है क्योंकि यह अभी भी एक महत्वपूर्ण सवाल है।

+0

मुझे लगता है कि इन अनबॉक्स किए गए नए प्रकार वर्णित प्रकार के समान हैं [यहां] (http://stackoverflow.com/questions/6358651/marking-primitive-types-with-phantom-types-in-scala/6360260#6360260), सही? – ziggystar