दिलचस्प पोस्ट
मैटलॉग से जावा कॉलिंग? जावा जीयूआई चौखटे क्या चुनना है? स्विंग, SWT, एडब्ल्यूटी, स्विंगएक्स, जेगूडिज़, जावा एफएक्स, अपाचे पिवट? एएसपी। नेट 2012 जेनोवा के साथ विनीत मान्यकरण क्या कोई CSS3 एनीमेशन पूरा होने पर एक कॉलबैक है? सीडी में iTextSharp का उपयोग कर पीडीएफ सामग्री पढ़ना सी ++ फ़ंक्शन से बहुआयामी सरणी रिटर्निंग एंड्रॉइड: पार्सलेट योग्य और सीरियलजबल के बीच अंतर? कैंसर 2 एचटीसी सेवा के साथ कैशिंग परिणाम एक तैयार किए गए स्थान की इनपुट पैरामीटर के रूप में एक कॉलम का नाम रखना पायथन अनुरोध – संपूर्ण http अनुरोध (कच्चे) प्रिंट करें? vba: सरणी से अद्वितीय मान प्राप्त करें स्विफ्ट बनाम जावा एफएक्स डेस्कटॉप अनुप्रयोगों के लिए MySQL utf8mb4, त्रुटियों को सहेजे जाने पर त्रुटियां रेगेक्स – क्या हाइफ़न बच जाएंगे? स्वचालित परिप्रेक्ष्य सुधार OpenCV

एकल ऑब्जेक्ट ऑब्जेक्ट ओरिएंटेड क्यों हैं?

स्कला में प्रोग्रामिंग में: एक व्यापक चरण-दर-चरण गाइड , लेखक ने कहा:

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

एकल ऑब्जेक्ट ऑब्जेक्ट ओरिएंटेड क्यों है? स्थिर सदस्यों का उपयोग न करने का अच्छा क्या है, लेकिन एकल ऑब्जेक्ट्स?

वेब के समाधान से एकत्रित समाधान "एकल ऑब्जेक्ट ऑब्जेक्ट ओरिएंटेड क्यों हैं?"

"बड़ी तस्वीर" की कोशिश कर रहा है; इनमें से अधिकांश अन्य उत्तर में शामिल किए गए हैं, लेकिन एक व्यापक उत्तर नहीं लगता है कि यह सब एक साथ रखता है और डॉट्स में जुड़ जाता है। तो यहाँ जाता है …

एक कक्षा पर स्थैतिक तरीकों एक वस्तु पर तरीकों नहीं हैं, इसका मतलब है कि:

  1. स्थैतिक सदस्यों को एक अभिभावक वर्ग / विशेषता से वंचित नहीं किया जा सकता है
  2. स्थिर सदस्यों का उपयोग किसी इंटरफ़ेस को लागू करने के लिए नहीं किया जा सकता
  3. किसी वर्ग के स्थिर सदस्यों को कुछ फ़ंक्शन के तर्क के रूप में नहीं दिया जा सकता है

    (और उपर्युक्त अंक की वजह से …)

  4. स्थैतिक सदस्यों को ओवरराइड नहीं किया जा सकता
  5. स्थिर सदस्य बहुरूपक नहीं हो सकते

वस्तुओं की संपूर्ण बात यह है कि वे अभिभावक वस्तुओं से प्राप्त कर सकते हैं, इंटरफेस लागू कर सकते हैं, और तर्क के रूप में पारित कर सकते हैं – स्थैतिक सदस्यों के पास इनमें से कोई गुण नहीं है, इसलिए वे वास्तव में ऑब्जेक्ट-ओरिएंटेड नहीं हैं, वे एक नेमस्पेस से थोड़ा अधिक हैं।

दूसरी ओर, सिंगलटन ऑब्जेक्ट, ऑब्जेक्ट कम्युनिटी के पूर्णतया सदस्य हैं।


सिंगलटन का एक और बहुत ही उपयोगी गुण यह है कि सिंगलटेन्स न होने के लिए वे बाद में कुछ बिंदुओं पर आसानी से बदल सकते हैं, यह एक विशेष रूप से दर्दनाक रिफैक्टरिंग है यदि आप स्थिर तरीके से शुरू करते हैं

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

सिंगलटन ऑब्जेक्ट कक्षाओं की तरह व्यवहार करते हैं जिसमें वे अन्य प्रकारों को लागू / कार्यान्वित कर सकते हैं।

जावा में सिर्फ स्थिर कक्षाओं के साथ ऐसा नहीं किया जा सकता है – यह जावा सिंगलटन पैटर्न पर एक getInstance साथ बहुत अधिक चीनी है जो (कम से कम) अच्छे नाम स्थान / स्थिर पहचानकर्ता और भेद को छुपाता है।

संकेत: इसे ऑब्जेक्ट- प्रोग्रामिंग प्रोग्राम कहा जाता है।

गंभीरता से।

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

नोट: यद्यपि यह निश्चित रूप से इस तरह से लगता है, मैं वास्तव में यहाँ चुस्त ध्वनि की कोशिश नहीं कर रहा हूँ। मैंने अन्य सभी उत्तरों को देखा है और मैंने उन्हें बहुत भ्रमित किया। मेरे लिए, यह स्पष्ट है कि "ऑब्जेक्ट-ओरिएंटेड" की परिभाषा के द्वारा ऑब्जेक्ट्स और विधियां नामस्थान और प्रक्रियाओं (जो कि स्थिर "पद्धतियाँ" वास्तव में हैं) की तुलना में ऑब्जेक्ट-उन्मुख हैं।

सिंगलटन ऑब्जेक्ट बनाने का एक विकल्प खुद को कक्षाएं बनाना होगा, जैसे रूबी, पायथन, स्मालटाक, न्यूज़पेक डू।

स्थिर सदस्यों के लिए, कोई वस्तु नहीं है वर्ग वास्तव में सिर्फ एक नेमस्पेस है

एक सिंगलटन में, हमेशा कम से कम एक ऑब्जेक्ट होता है

सभी ईमानदारी में, यह विभाजन बाल है

यह अधिक वस्तु उन्मुख है जिसमें स्काला वर्ग दिया गया है, प्रत्येक विधि कॉल उस ऑब्जेक्ट पर एक विधि कॉल है। जावा में, स्थैतिक तरीकों ऑब्जेक्ट स्टेट के साथ इंटरैक्ट नहीं करते हैं।

वास्तव में, किसी वस्तु को a स्थैतिक विधि m() साथ A दी, तो इसे कॉल करने के लिए बुद्ध प्रथा माना जाता है am() । इसके बजाय इसे Am() ( Am() को कॉल करने की सलाह दी जाती है (मुझे विश्वास है कि ग्रहण आपको चेतावनी देगा) जावा स्थैतिक तरीकों को ओवरराइड नहीं किया जा सकता, वे सिर्फ एक और विधि द्वारा छिपाए जा सकते हैं:

 class A { public static void m() { System.out.println("m from A"); } } public class B extends A { public static void m() { System.out.println("m from B"); } public static void main(String[] args) { A a = new B(); am(); } } 

क्या होगा am() प्रिंट am() ?

स्काला में, आप साथी ऑब्जेक्ट ए और बी में स्थिर विधियों को छड़ी करेंगे और आप स्पष्ट रूप से साथी ए या बी को स्पष्ट रूप से देखेंगे।

स्काला में इसी उदाहरण को जोड़ना:

 class A object A { def m() = println("m from A") } class B extends A object B { def m() = println("m from B") def main(args: Array[String]) { val a = new B Am() // cannot call am() } } 

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

यह एक विपणन बात है, वास्तव में दो उदाहरणों पर विचार करें:

 class foo static const int bar = 42; end class class superfoo Integer bar = ConstInteger.new(42); end class 

अब, क्या देखने योग्य अंतर क्या हैं?

  • एक अच्छी तरह से व्यवहार की भाषा में, अतिरिक्त भंडारण का निर्माण एक ही है
  • Foo.bar और Superfoo.bar वास्तव में एक ही हस्ताक्षर, पहुंच, और इतने पर है।
  • Superfoo.bar को अलग तरह से आवंटित किया जा सकता है लेकिन यह एक कार्यान्वयन विवरण है

यह मुझे 20 साल पहले धार्मिक युद्धों की याद दिलाता है कि सी ++ या जावा "वास्तव में" ऑब्जेक्ट ओरिएंटेड थे, क्योंकि दोनों ने "आदिम" वस्तुओं को उजागर किए जाने के बाद से, इसलिए, उदाहरण के लिए आप int से प्राप्त नहीं कर सकते लेकिन Integer से हो सकता है