2015-08-18 8 views
29

मैं एक solution के लिए स्काला और अक्का और मेरी हाल ही में देखने में सीख रहा हूँ, मैं की तरहकेस क्लास और केस ऑब्जेक्ट के बीच अंतर?

case class TotalTaxResult(taxAmount:Double) 
case object TaxCalculationTimeout 

दोनों के बीच अंतर क्या है कुछ पाया?

मुझे दूसरे पर एक का उपयोग कब करना चाहिए?

उत्तर

44

एक केस क्लास तर्क ले सकता है, इसलिए उस केस क्लास का प्रत्येक उदाहरण इसके तर्कों के मूल्यों के आधार पर भिन्न हो सकता है। दूसरी ओर एक केस ऑब्जेक्ट कन्स्ट्रक्टर में तर्क नहीं लेता है, इसलिए इसमें केवल एक उदाहरण हो सकता है (एक सिंगलटन, नियमित स्कैला object है)।

यदि आपके अभिनेता को आपका संदेश किसी भी मूल्य भेदभाव की आवश्यकता नहीं है, तो केस ऑब्जेक्ट का उपयोग करें। उदाहरण के लिए, यदि आप एक अभिनेता है कि कुछ काम किया है, और आप, बाहर से था, काम करने के लिए यह बताने के लिए है, तो हो सकता है आप कुछ इस तरह करते हैं चाहते हैं चाहता था:

case object DoWork 

... 

def receive = { 
    case DoWork => 
    //do some work here 
} 

लेकिन आप कुछ चाहते थे कैसे काम हो गया है में भिन्नता है, तुम तो जैसे अपने संदेश को फिर से परिभाषित करने के लिए आवश्यकता हो सकती है:

case class DoWorkAfter(waitTime:Long) 

... 

def receive = { 
    case class DoWorkAfter(time) => 
    context.system.scheduler.scheduleOnce(time.milliseconds, self, DoWork) 

    case DoWork => 
    //do some work here 
} 
6

एक केस ऑब्जेक्ट एक सिंगलटन केस क्लास है। वे गणना मूल्यों की तरह इस्तेमाल किया जाता है। यह सिर्फ किसी भी अन्य मूल्य की तरह पैटर्न मिलान में इस्तेमाल किया जा सकता है:

TaxCalculationTimeout match { 
    case TaxCalculationTimeout => println("hello") 
} 

जब आप एक मामले वर्ग को परिभाषित, तो आप उस वर्ग के उदाहरण के लिए एक टेम्पलेट बना रहे हैं। TotalTaxResult(1.0) और TotalTaxResult(2.0) एक ही प्रकार के दो अलग-अलग मान हैं। जबकि वास्तव में एक TaxCalculationTimeout मान है।

2

सरल शब्दों में, स्काला एक ऑब्जेक्ट ओरिएंटेड और कार्यात्मक प्रोग्रामिंग भाषा है। इसमें कार्यात्मक प्रोग्रामिंग की विशेषताएं हैं जैसे शुद्ध ऑब्जेक्ट ओरिएंटेड पद्धति के साथ पैटर्न मिलान।

कुछ बार, हमें पैटर्न मिलान के लिए कुछ सिग्नल पास करने जैसे किसी भी मूल्य के बिना सिंगलटन ऑब्जेक्ट बनाने की आवश्यकता होती है। यदि स्कैला में केस ऑब्जेक्ट की अवधारणा नहीं है तो हमें केवल एनम का उपयोग करने की आवश्यकता है या मिलान में कुछ स्ट्रिंग मान बराबर है। लेकिन यह शुद्ध ऑब्जेक्ट ओरिएंटेड भाषा में पठनीयता नहीं है .. उस परिदृश्य में हम केस ऑब्जेक्ट

केस क्लासेस का उपयोग तब करते हैं जब हमें विभिन्न मानों के साथ एकाधिक ऑब्जेक्ट्स बनाने की आवश्यकता होती है।

2

आप इन दोनों के बारे में सोच सकते हैं कि वे एक वर्ग और सामान्य रूप से एक वस्तु हो। जब आप केस क्लास क्लासनाम (पैराम्स सूची) करते हैं तो यह ऑब्जेक्ट्स बनाने के लिए ब्लूप्रिंट बनाता है और केस ऑब्जेक्ट एक सिंगलटन ऑब्जेक्ट को उस दायरे में परिभाषित करता है जिसमें इसे घोषित किया जाता है। स्कैला 2.10 से शुरू होने पर, आपको किसी भी तर्क के बिना कक्षाओं के मामले में हमेशा केस ऑब्जेक्ट्स का उपयोग करना चाहिए। तो जब आप कुछ मानों पर एक पैटर्न मैच करना चाहते हैं जिसके लिए तर्क की आवश्यकता है तो आपको केस क्लास के लिए जाना चाहिए, लेकिन यदि आपके मान तर्क नहीं लेते हैं तो आपको केस ऑब्जेक्ट का उपयोग करना चाहिए।

संबंधित मुद्दे