केस ऑब्जेक्ट और ऑब्जेक्ट के बीच अंतर


226

क्या स्केला में केस ऑब्जेक्ट और ऑब्जेक्ट के बीच कोई अंतर है?


3
उसके पास एक बिंदु है - उस पर पैटर्न मैच करने में सक्षम होने के लिए एक केस ऑब्जेक्ट होना आवश्यक नहीं है। मुझे लगता है कि यह पिछले प्रश्न में संबोधित नहीं किया गया था ...
axel22

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

4
caseपैटर्न मिलान करने के लिए उपयोग करना आवश्यक नहीं है , यह सिर्फ चीनी है। unapplyअपने आप को लागू करना काम करता है।
राफेल

1
स्वीकृत उत्तर केवल प्रश्न का उत्तर नहीं देता है, जैसा कि उस पर टिप्पणियों में चर्चा की गई है। रास्ता बनाने के लिए बहुत देर हो चुकी है, लेकिन ध्यान दिया जाना चाहिए।
13

स्वीकृत उत्तर को संपादित करने में बहुत देर नहीं हुई है। संपादित की समीक्षा की जाएगी और यदि प्रासंगिक है, तो स्वीकार कर लिया जाएगा।
C4stor

जवाबों:


111

केस की कक्षाएं नियमित कक्षाओं से भिन्न होती हैं जो उन्हें मिलती हैं:

  1. पैटर्न मिलान समर्थन
  2. के डिफ़ॉल्ट कार्यान्वयन equalsऔरhashCode
  3. क्रमांकन के डिफ़ॉल्ट कार्यान्वयन
  4. का एक डिफ़ॉल्ट डिफ़ॉल्ट कार्यान्वयन toString, और
  5. कार्यक्षमता की छोटी राशि जो उन्हें स्वचालित रूप से विरासत में मिली है scala.Product

पैटर्न मिलान, बराबरी और हैशकोड सिंगलटन के लिए ज्यादा मायने नहीं रखते हैं (जब तक कि आप वास्तव में कुछ पतित नहीं करते हैं), तो आप बहुत अधिक हो रहे हैं बस क्रमबद्धता, एक अच्छा toStringऔर कुछ विधियां जो आप शायद कभी उपयोग नहीं करेंगे।


46
इस उत्तर के बिंदु 3 और 4 में केस ऑब्जेक्ट्स और ऑब्जेक्ट्स के बीच सही अंतर है। प्वाइंट 1 और 2 सिंगलटन ऑब्जेक्ट्स के लिए मायने नहीं रखता है। और सिंगलटन ऑब्जेक्ट्स हमेशा Arity 0 वाले उत्पाद होते हैं, इसलिए पॉइंट 5 भी मायने नहीं रखता।
वोज्शिएक डार्स्कीस्की

86
यह पोस्ट उस मिथक को objectसमाप्त करता है जो एक सिंगलटन के समान है। यह नहीं। बल्कि यह ठीक वैसा ही है जैसा वह कहता है, एक वस्तु, एक में एक घोषणा और तात्कालिकता। objectयदि पैकेज स्कोप में परिभाषित किया गया है, तो यह एक एकल उदाहरण तक सीमित है, जो प्रभावी रूप से इसे एक सिंगलटन बनाता है, लेकिन केवल अगर इसे थप्पड़ में परिभाषित किया गया है। यदि किसी वर्ग के अंदर परिभाषित किया गया है, तो आपके पास कक्षा के रूप में कई उदाहरण हो सकते हैं (यह आलसी रूप से त्वरित है, इसलिए जरूरी नहीं कि यह 1-1 है)। और उन आंतरिक वस्तुओं को बहुत अच्छी तरह से हैश कीज के रूप में इस्तेमाल किया जा सकता है, जिससे डिफ़ॉल्ट बराबरी / हैशकोड बहुत समझदार हो जाता है।
nilskp

66
सवाल case objectकक्षा के बारे में नहीं है, यह सही उत्तर क्यों है?
Ixx

10
इस सवाल का जवाब नहीं है। यह उत्तर case classएक और के बीच के अंतर से संबंधित है class। प्रश्न case objectऔर के बीच अंतर के बारे में है object
MK

6
@ C4stor जवाब यह नहीं कहता कि, हालांकि। ऑब्जेक्ट क्लास नहीं है। यह देखते हुए कि केस क्लासेस पर्दे के पीछे उचित मात्रा में जादू करता है, स्काला के विभिन्न किनारे के मामलों और जटिलताओं को देखते हुए, यह मानने का कोई कारण नहीं है कि केवल एक मानक स्काला ऑब्जेक्ट और एक केस ऑब्जेक्ट के बीच का अंतर जो हम अंतर के बारे में जानते हैं उसके द्वारा समझाया गया है। मानक कक्षाओं और केस कक्षाओं के बीच। यह उत्तर प्रश्न के शब्दांकन को भी संबोधित नहीं करता है।
इसका कर्क

137

यहां एक अंतर है - केस ऑब्जेक्ट्स 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$

15
मुझे लगता है कि उस मामले वस्तुओं धारावाहिक जा सकती है, विशेष रूप से अभिनेताओं के बीच नेटवर्क संचार में नियमित रूप से वस्तुओं से सबसे अंतर नहीं है
爱国者

14
जोड़ना extends Serializableहालांकि एक ही चाल करना चाहिए।
nilskp

36
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


2

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


0

इसके साथ समान है case classऔर class, हम बस का उपयोग case objectकरने के बजाय case classजब वहाँ नहीं है किसी भी अतिरिक्त राज्य सूचना का प्रतिनिधित्व करने के खेतों।


0

हम वस्तुओं और "केस क्लास" को पहले से जानते हैं। लेकिन "केस ऑब्जेक्ट" दोनों का मिश्रण है अर्थात यह एक ऑब्जेक्ट के समान एक सिंगलटन है और बहुत सारे बॉयलरप्लेट के साथ केस क्लास में है। एकमात्र अंतर यह है कि बॉयलरप्लेट को एक वर्ग के बजाय एक वस्तु के लिए किया जाता है।

मामले वस्तुएं नीचे वाले के साथ नहीं आएंगी:

लागू करें, तरीकों को लागू करें। यहाँ कोई प्रतिलिपि विधियाँ नहीं हैं क्योंकि यह एक सिंगलटन है। संरचनात्मक समानता तुलना के लिए कोई विधि नहीं। कोई कंस्ट्रक्टर भी नहीं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.