2011-06-30 14 views
31

में सिंगलटन ऑब्जेक्ट्स का स्पष्टीकरण मुझे कोडिंग मिलता है कि आप मूल रूप से "ऑब्जेक्ट कुछ क्लास" और "क्लास कुछ क्लास" प्रदान करते हैं और साथी वर्ग कक्षा घोषणा है और ऑब्जेक्ट singleton है। जिसमें से आप एक उदाहरण नहीं बना सकते हैं। तो ... मेरा प्रश्न ज्यादातर इस विशेष उदाहरण में सिंगलटन ऑब्जेक्ट का उद्देश्य है।स्कैला

क्या यह मूल रूप से स्कैला में कक्षा विधियों को प्रदान करने का एक तरीका है? Objective-C पर आधारित तरीकों की तरह?

मैं Programming in Scala पुस्तक पढ़ रहा हूं और अध्याय 4 ने सिंगलटन ऑब्जेक्ट्स के बारे में बात की है, लेकिन यह इस बात पर बहुत अधिक जानकारी नहीं लेता है कि यह क्यों मायने रखता है।

मुझे एहसास है कि मैं यहां अपने आप से आगे निकल रहा हूं और बाद में इसे अधिक विस्तार से समझाया जा सकता है। यदि हां, तो मुझे बताएं। यह पुस्तक अभी तक काफी अच्छी है, लेकिन इसमें बहुत कुछ है "जावा में, आप यह करते हैं", लेकिन मेरे पास इतना छोटा जावा अनुभव है कि मुझे डरने वाले बिंदुओं में से कुछ याद आती है। मैं नहीं चाहता कि यह उन स्थितियों में से एक हो।

मैं Programming in Scala website कि जावा इस पुस्तक को पढ़ के लिए एक शर्त थी पर कहीं भी पढ़ने को याद नहीं है ...

+0

वास्तव में लेखकों का दावा है कि जावा एक पूर्व-आवश्यकता नहीं है, लेकिन वे यह भी टिप्पणी करते हैं कि तुलना करने के लिए यह उपयोगी है। दूसरे संस्करण [स्कैला में प्रोग्रामिंग] की शुरूआत में (http://www.artima.com/shop/programming_in_scala_2ed): "दूसरी तरफ, प्रोग्रामिंग भाषाओं का कोई विशिष्ट ज्ञान आवश्यक नहीं है। हालांकि अधिकांश लोग स्कैला का उपयोग करते हैं जावा प्लेटफार्म, यह पुस्तक आपको जावा के बारे में कुछ भी नहीं मानती है। हालांकि, हम उम्मीद करते हैं कि कई पाठक जावा से परिचित हों, और इसलिए हम कभी-कभी स्केल को जावा से तुलना करते हैं ताकि पाठकों को मतभेदों को समझने में मदद मिल सके। " ओडर्स्की एट अल (2008 [2010]: एक्सएलवी)। –

उत्तर

50

हां, साथी सिंगलेट्स जावा के (और सी ++, सी # एस, इत्यादि) स्थिर विधियों के बराबर प्रदान करते हैं।

हालांकि, एकमात्र इससे भी आगे एक निष्पक्ष तरीके जाना (वास्तव में, साथी वस्तु तरीकों जावा इंटरॉप की खातिर "स्थिर भाड़ा के" के माध्यम से संपर्क में हैं)।

  • एक सिंगलटन अन्य कक्षाओं/लक्षणों से विधियों का उत्तराधिकारी हो सकता है, जो सांख्यिकी के साथ नहीं किया जा सकता है।
  • एक सिंगलटन एक पैरामीटर (शायद एक विरासत इंटरफेस के माध्यम से)
  • एक सिंगलटन एक आसपास के वर्ग या विधि के दायरे के भीतर मौजूद कर सकते हैं, जावा इनर क्लासों है
  • यह भी ध्यान देने योग्य बात है कि लायक है सकते हैं बस के रूप में के रूप में पारित किया जा सकता एक सिंगलटन को एक साथी होने की ज़रूरत नहीं है, यह एक साथी वर्ग को परिभाषित किए बिना सिंगलटन को परिभाषित करने के लिए पूरी तरह से मान्य है।

में मदद करता है कौन सा स्काला में कहीं अधिक वस्तु उन्मुख भाषा है कि जावा (स्थितिक प्रणालियां किसी वस्तु से संबंधित नहीं है) बनाते हैं। पुरानी, ​​यह देखते हुए कि इसके कार्यात्मक प्रमाण-पत्रों के संदर्भ में इसकी काफी चर्चा हुई है।

+0

जब आप दिखाए गए थे तो मैं सिर्फ [आपके उत्तर] के लिंक को जोड़ रहा था (http://stackoverflow.com/questions/4112088/why-are-singleton-objects-more-object-orientated/4112864#4112864) । अच्छी मानसिक शक्तियां। –

+0

आप जानते हैं, मैं बस उस बारे में भूल गया! –

+0

धन्यवाद, कमाल का जवाब। इसकी प्रशंसा करना। – gks

2

हाँ, यह मूल रूप से class methods प्रदान जब एक साथी वस्तु के रूप में इस्तेमाल करने का एक तरीका है।

13

कई मामलों में हमें अपने सॉफ़्टवेयर सिस्टम में अद्वितीय ऑब्जेक्ट के लिए खड़े होने के लिए सिंगलटन की आवश्यकता होती है। सौर मंडल के बारे में सोचें। हम वर्गों निम्नलिखित हो सकता है

class Planet 
object Earth extends Planet 
object Sun extends Planet 

वस्तु सिंगलटन बनाने के लिए एक आसान तरीका है, बेशक यह आम तौर पर कक्षा स्तर विधि बनाने के लिए, स्थैतिक विधि के रूप में जावा में प्रयोग किया जाता है

+1

+1 उदाहरण के लिए अपनी पसंद के माध्यम से जावा की गणनाओं के समानता पर संकेत देने के लिए +1 ... –

4

दिए गए उत्तर को अतिरिक्त (और जा रहा जिलिन के समान सामान्य दिशा में), object एस स्कैला के implicit तंत्र में एक महत्वपूर्ण भूमिका निभाते हैं, उदाहरण के लिएप्रकार श्रेणी की तरह की अनुमति के व्यवहार (हास्केल से जाना जाता है के रूप में):

trait Monoid[T] { 
    def zero:T 
    def sum(t1:T, t2:T):T 
} 

def fold[T](ts:T*)(implicit m:Monoid[T]) = ts.foldLeft(m.zero)(m.sum(_,_)) 

अब हम एक fold समारोह है। जो T के लिए (ऐसी चीजें जिनके पास एक तटस्थ तत्व है, और "किसी भी तरह" जोड़ा जा सकता है) के साथ T एस एक साथ "ध्वस्त" हो जाता है। आदेश में इस का उपयोग करने में, हम एक Monoid का केवल एक उदाहरण कुछ प्रकार T के लिए, एक object के लिए एकदम सही काम की जरूरत है:

implicit object StringMonoid extends Monoid[String] { 
    def zero = "" 
    def sum(s1:String, s2:String) = s1 + s2 
} 

अब इस काम करता है:

println(fold("a","bc","def")) //--> abcdef 

तो object रों हैं अपने ही अधिकार में बहुत उपयोगी है।

लेकिन प्रतीक्षा करें, और भी कुछ है! साथी वस्तुओं भी जब उनके साथी वर्ग विस्तार "डिफ़ॉल्ट कॉन्फ़िगरेशन" का एक प्रकार के रूप में सेवा कर सकते हैं: एक ओर आप विशेषता Config, उपयोगकर्ता हालांकि वह चाहती द्वारा कार्यान्वित किया जा सकता है, जो है पर तो

trait Config { 
    def databaseName:String 
    def userName:String 
    def password:String 
} 

object Config extends Config { 
    def databaseName = "testDB" 
    def userName = "scott" 
    def password = "tiger" 
} 

, लेकिन दूसरी ओर जब आप डिफ़ॉल्ट सेटिंग्स के साथ जाना चाहते हैं तो एक तैयार वस्तु Config है।

+1

मुझे यह जवाब नहीं समझा – Valentin

+3

@ वेलेंटीन Vasilyev मुझे यह सुनकर खेद है, लेकिन मैं संभवतः यहां सभी विवरणों को समझा नहीं सकता, इसलिए मैंने कुछ उपयोग मामलों पर ब्रश किया। इस सामान से विस्तार से उत्कृष्ट ट्यूटोरियल हैं, और विशेष रूप से अंतर्निहित तंत्र एक बहुत ही उपयोगी और बहुमुखी उपकरण है, लेकिन विभिन्न मामलों के लिए बहुत सारी स्पष्टीकरण की आवश्यकता है। – Landei