कोटलिन में जावा स्थिर क्षेत्रों के प्रतिस्थापन के रूप में हम "साथी वस्तु" का उपयोग क्यों करते हैं?


145

"साथी वस्तु" का अभिप्राय क्या है? अब तक मैं इसे जावा की जगह पर इस्तेमाल कर staticरहा हूं जब मुझे इसकी आवश्यकता होती है।

मैं उलझन में हूँ:

  • इसे "साथी" क्यों कहा जाता है?
  • क्या इसका मतलब है कि कई स्थिर गुणों को बनाने के लिए , मुझे इसे companion objectब्लॉक के अंदर एक साथ समूहित करना होगा ?
  • तुरंत एक एकल उदाहरण बनाने के लिए जो एक वर्ग के लिए स्कूप किया जाता है, मैं अक्सर लिखता हूं

:

companion object {
    val singleton by lazy { ... }
}

जो ऐसा करने का एक सर्वव्यापी तरीका लगता है। बेहतर तरीका क्या है?

जवाबों:


108
  • "साथी वस्तु" का अभिप्राय क्या है? इसे "साथी" क्यों कहा जाता है?

    सबसे पहले, Kotlin के जावा अवधारणा का उपयोग नहीं करता staticसदस्यों क्योंकि Kotlin अपनी ही है की अवधारणा objectरों गुण और सिंगलटन राज्य के साथ जुड़े हुए कार्यों वर्णन करने के लिए, और जावा staticएक वर्ग का हिस्सा सुंदर ढंग से सिंगलटन के रूप में व्यक्त किया जा सकता है: यह एक सिंगलटन उद्देश्य यह है कि है वर्ग के नाम से पुकारा जा सकता है। इसलिए नामकरण: यह एक ऐसी वस्तु है जो एक वर्ग के साथ आती है।

    इसका नाम हुआ करता था class objectऔरdefault object है, लेकिन फिर इसका नाम बदलकर हो गया करने के लिएcompanion object जो और अधिक स्पष्ट है और यह भी साथ संगत है स्काला साथी वस्तुओं

    नामकरण के अलावा, यह जावा staticसदस्यों की तुलना में अधिक शक्तिशाली है : यह कक्षाओं और इंटरफेस का विस्तार कर सकता है, और आप अपनी वस्तुओं की तरह ही इसे संदर्भ और पास कर सकते हैं।

  • क्या इसका मतलब है कि कई स्थिर गुणों को बनाने के लिए, मुझे इसे companion objectब्लॉक के अंदर एक साथ समूहित करना होगा ?

    हाँ, यह मुहावरेदार तरीका है। या आप उन्हें गैर-साथी वस्तुओं में भी रख सकते हैं:

    class MyClass {
        object IO {
            fun makeSomethingWithIO() { /* ... */ }
        }
    
        object Factory {
            fun createSomething() { /* ... */ }
        }
    }
    
  • तुरंत एक एकल उदाहरण बनाने के लिए जो एक वर्ग के लिए स्कोप किया जाता है, मैं अक्सर लिखता हूं /*...*/जो ऐसा करने का एक सर्वव्यापी तरीका लगता है। बेहतर तरीका क्या है?

    यह इस बात पर निर्भर करता है कि आपको प्रत्येक विशेष मामले में क्या चाहिए। आपका कोड एक वर्ग के लिए बाध्य राज्य के लिए अच्छी तरह से सूट करता है जो इसे पहली कॉल पर शुरू किया जाता है।

    यदि आपको इसे किसी वर्ग के साथ जोड़ने की आवश्यकता नहीं है, तो बस ऑब्जेक्ट घोषणा का उपयोग करें:

    object Foo {
        val something by lazy { ... }
    }
    

    आप जावा स्टैटिक इनिशियलाइज़र की तरह ही संपत्ति को प्रथम श्रेणी के उपयोग पर आरम्भ करने के लिए lazy { ... }प्रतिनिधिमंडल को भी हटा सकते हैं

    आप सिंगलटन स्टेट को इनिशियलाइज़ करने के उपयोगी तरीके भी पा सकते हैं ।


अच्छे और मुहावरेदार उदाहरण।
त्रियुंड

19

इसे "साथी" क्यों कहा जाता है?

यह वस्तु उदाहरणों की सहचरी है। IIRC यहां लंबी चर्चा थी: आगामी-परिवर्तन-वर्ग-ऑब्जेक्ट-पुनर्विचार

क्या इसका मतलब यह है कि कई स्थिर गुणों को बनाने के लिए, मुझे इसे एक साथ मिलकर ऑब्जेक्ट ऑब्जेक्ट ब्लॉक में बनाना होगा?

हाँ। प्रत्येक "स्थिर" संपत्ति / विधि को इस साथी के अंदर रखा जाना चाहिए।

तुरंत एक एकल उदाहरण बनाने के लिए जो एक वर्ग के लिए स्कूप किया जाता है, मैं अक्सर लिखता हूं

आप तुरंत एकल उदाहरण नहीं बनाते हैं। इसे singletonपहली बार एक्सेस करने के दौरान बनाया गया है ।

जो ऐसा करने का एक सर्वव्यापी तरीका लगता है। बेहतर तरीका क्या है?

बल्कि object Singleton { }एक एकल वर्ग को परिभाषित करने के लिए साथ चलते हैं । देखें: वस्तु घोषणाएं आपको इसका उदाहरण नहीं बनाना है Singleton, बस इसे ऐसे ही उपयोग करना हैSingleton.doWork()

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


7

इसे "साथी" क्यों कहा जाता है?

किसी कक्षा के अंदर एक वस्तु घोषणा को साथी कीवर्ड के साथ चिह्नित किया जा सकता है:

class MyClass {
    companion object Factory {
        fun create(): MyClass = MyClass()
    }
}

साथी ऑब्जेक्ट के सदस्यों को केवल क्वालीफायर के रूप में वर्ग नाम का उपयोग करके बुलाया जा सकता है:

val instance = MyClass.create()

यदि आप 'साथी' के बिना केवल 'ऑब्जेक्ट' का उपयोग करते हैं, तो आपको इस तरह करना होगा:

val instance = MyClass.Factory.create()

मेरी समझ में, 'साथी' का अर्थ है कि यह वस्तु परिचर वर्ग का साथी है।


"साथी" के बिना "ऑब्जेक्ट" को इस तरह कहा जाता है (MyClass ()। create ())। एक सिंगलटन की तरह, लेकिन सिंगलटन ऑब्जेक्ट को एक्सेस करने के लिए आपको पहले "बाहरी" क्लास को इनिशियलाइज़ करना होगा।
LiTTle

0

हम कह सकते हैं कि साथी जावा की तरह "स्टेटिक ब्लॉक" के समान है, लेकिन कोटलिन के मामले में कोई स्टैटिक ब्लॉक अवधारणा नहीं है, क्योंकि साथी फ्रेम में आता है।

एक साथी ब्लॉक को कैसे परिभाषित करें:

class Example {
      companion object {
        fun display(){
        //place your code
     }
  }
}

साथी ब्लॉक की कॉलिंग विधि, कक्षा के नाम के साथ प्रत्यक्ष

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