क्या स्केला में केस ऑब्जेक्ट और ऑब्जेक्ट के बीच कोई अंतर है?
case
पैटर्न मिलान करने के लिए उपयोग करना आवश्यक नहीं है , यह सिर्फ चीनी है। unapply
अपने आप को लागू करना काम करता है।
क्या स्केला में केस ऑब्जेक्ट और ऑब्जेक्ट के बीच कोई अंतर है?
case
पैटर्न मिलान करने के लिए उपयोग करना आवश्यक नहीं है , यह सिर्फ चीनी है। unapply
अपने आप को लागू करना काम करता है।
जवाबों:
केस की कक्षाएं नियमित कक्षाओं से भिन्न होती हैं जो उन्हें मिलती हैं:
equals
औरhashCode
toString
, औरscala.Product
। पैटर्न मिलान, बराबरी और हैशकोड सिंगलटन के लिए ज्यादा मायने नहीं रखते हैं (जब तक कि आप वास्तव में कुछ पतित नहीं करते हैं), तो आप बहुत अधिक हो रहे हैं बस क्रमबद्धता, एक अच्छा toString
और कुछ विधियां जो आप शायद कभी उपयोग नहीं करेंगे।
object
समाप्त करता है जो एक सिंगलटन के समान है। यह नहीं। बल्कि यह ठीक वैसा ही है जैसा वह कहता है, एक वस्तु, एक में एक घोषणा और तात्कालिकता। object
यदि पैकेज स्कोप में परिभाषित किया गया है, तो यह एक एकल उदाहरण तक सीमित है, जो प्रभावी रूप से इसे एक सिंगलटन बनाता है, लेकिन केवल अगर इसे थप्पड़ में परिभाषित किया गया है। यदि किसी वर्ग के अंदर परिभाषित किया गया है, तो आपके पास कक्षा के रूप में कई उदाहरण हो सकते हैं (यह आलसी रूप से त्वरित है, इसलिए जरूरी नहीं कि यह 1-1 है)। और उन आंतरिक वस्तुओं को बहुत अच्छी तरह से हैश कीज के रूप में इस्तेमाल किया जा सकता है, जिससे डिफ़ॉल्ट बराबरी / हैशकोड बहुत समझदार हो जाता है।
case object
कक्षा के बारे में नहीं है, यह सही उत्तर क्यों है?
case class
एक और के बीच के अंतर से संबंधित है class
। प्रश्न case object
और के बीच अंतर के बारे में है object
।
यहां एक अंतर है - केस ऑब्जेक्ट्स Serializable
विशेषता का विस्तार करते हैं , इसलिए उन्हें क्रमबद्ध किया जा सकता है। नियमित ऑब्जेक्ट डिफ़ॉल्ट रूप से नहीं कर सकते:
scala> object A
defined module A
scala> case object B
defined module B
scala> import java.io._
import java.io._
scala> val bos = new ByteArrayOutputStream
bos: java.io.ByteArrayOutputStream =
scala> val oos = new ObjectOutputStream(bos)
oos: java.io.ObjectOutputStream = java.io.ObjectOutputStream@e7da60
scala> oos.writeObject(B)
scala> oos.writeObject(A)
java.io.NotSerializableException: A$
extends Serializable
हालांकि एक ही चाल करना चाहिए।
scala> object foo
परिभाषित वस्तु फू
scala> case object foocase
परिभाषित वस्तु फ़ोकस
सीरियलाइज़ेशन अंतर:
scala> foo.asInstanceOf[Serializable]
java.lang.ClassCastException: foo $ scala.Serializable में ढाला नहीं जा सकता है
... 43 elided
scala> foocase.asInstanceOf[Serializable]
res1: सीरियल करने योग्य = फ़ोकस
.String अंतर:
scala> foo
res2: foo.type = foo $ @ 7bf0bac8
scala> foocase
res3: foocase.type = foocase
मामले की वस्तुएं स्पष्ट रूप से तरीकों के कार्यान्वयन के साथ आती हैं, बराबर होती हैं, और हैशकोड, लेकिन सरल ऑब्जेक्ट नहीं होते हैं। केस ऑब्जेक्ट्स को क्रमबद्ध किया जा सकता है जबकि साधारण ऑब्जेक्ट्स नहीं कर सकते हैं, जो केस ऑब्जेक्ट्स को अक्का-रिमोट वाले संदेशों के रूप में बहुत उपयोगी बनाता है। ऑब्जेक्ट कीवर्ड से पहले केस कीवर्ड जोड़ना ऑब्जेक्ट को सीरियल करने योग्य बनाता है।
हम वस्तुओं और "केस क्लास" को पहले से जानते हैं। लेकिन "केस ऑब्जेक्ट" दोनों का मिश्रण है अर्थात यह एक ऑब्जेक्ट के समान एक सिंगलटन है और बहुत सारे बॉयलरप्लेट के साथ केस क्लास में है। एकमात्र अंतर यह है कि बॉयलरप्लेट को एक वर्ग के बजाय एक वस्तु के लिए किया जाता है।
मामले वस्तुएं नीचे वाले के साथ नहीं आएंगी:
लागू करें, तरीकों को लागू करें। यहाँ कोई प्रतिलिपि विधियाँ नहीं हैं क्योंकि यह एक सिंगलटन है। संरचनात्मक समानता तुलना के लिए कोई विधि नहीं। कोई कंस्ट्रक्टर भी नहीं।