2017-05-08 9 views
21

मैं एक सार्वजनिक आवृत्ति चर में कक्षा उदाहरण सहेजने में सक्षम होना चाहता हूं लेकिन मुझे यह नहीं पता कि कोटलिन में यह कैसे किया जाए।कोटलिन स्थिर विधियों और चर

class Foo { 

    public static Foo instance; 
    public Foo() { 
     instance = this; 
    } 

} 
+6

https://kotlinlang.org/docs/reference/classes.html#companion-objects। लेकिन यह मेरे लिए भयानक लग रहा है।आप एक म्यूटेबल स्थिर क्षेत्र (खराब अभ्यास पहले से ही) का उपयोग क्यों करना चाहते हैं, और प्रत्येक बार जब आप फू का उदाहरण बनाते हैं तो उसे संशोधित करें? आप क्या हासिल करने का प्रयास कर रहे हैं? –

+3

यदि आप सिंगलटन बनाना चाहते हैं, तो https://kotlinlang.org/docs/reference/object-declarations.html#object-declarations देखें। –

उत्तर

32

जावा के स्थैतिक क्षेत्रों की सबसे नज़दीकी चीज एक साथी वस्तु है। https://kotlinlang.org/docs/reference/object-declarations.html#companion-objects

Kotlin में आपका कोड कुछ इस तरह दिखेगा:: आप यहाँ उनके लिए प्रलेखन संदर्भ पा सकते हैं

class Foo { 

    companion object { 
     lateinit var instance: Foo 
    } 

    init { 
     instance = this 
    } 

} 

आप अपने क्षेत्रों/तरीकों जावा कॉल करने के लिए स्थिर के रूप में उजागर किया चाहते हैं, आप कर सकते हैं @JvmStatic एनोटेशन लागू होते हैं:

class Foo { 

    companion object { 
     @JvmStatic lateinit var instance: Foo 
    } 

    init { 
     instance = this 
    } 

} 
+2

'इंस्टेंस' फ़ील्ड घोषित करने के लिए 'साथी ऑब्जेक्ट' का उपयोग एक बॉयलरप्लेट है जिसे कोटलिन कंपाइलर द्वारा स्वचालित रूप से देखभाल की जाती है यदि आप 'फू' को 'ऑब्जेक्ट फू {...} ' –

4

पहले आप तो बाद एक ब्लॉक साथी वस्तु उनके बाद कीवर्ड बनाने के लिए एक सरल वर्ग बनाने

उदाहरण के लिए:

class Test{ 

    companion object{ 

     fun getValue(): String{ 

      return "Test String" 

     } 
    } 
} 

आप उदाहरण के लिए वर्ग के नाम डॉट समारोह नाम

का उपयोग कर इस वर्ग के समारोह कॉल कर सकते हैं:

// here you will get the function value 
Test.getValue() 
0

आप वर्ग के लिए एक साथी वस्तु बना सकते हैं, और यदि आप वास्तव में क्षेत्र स्थिर होने के लिए क्या आप एनोटेशन @ जेवीएमस्टैटिक का उपयोग कर सकते हैं। सहयोगी वस्तु के वर्ग के निजी सदस्यों तक पहुंच है, जिसके लिए यह साथी है।

एक उदाहरण नीचे देखें:

class User { 
    private lateinit var name: String 

    override fun toString() = name 

    companion object { 
     @JvmStatic 
     val instance by lazy { 
      User().apply { name = "jtonic" } 
     } 
    } 
} 

class CompanionTest { 

    @Test 
    fun `test companion object`() { 
     User.instance.toString() shouldBe "jtonic" 
    } 
} 
9

ऐसा लगता है कि आप एक सिंगलटन वस्तु को परिभाषित करना चाहते। यह एक प्रथम श्रेणी के अवधारणा के रूप में Kotlin में समर्थित है:

object Foo { 
    ... 
} 

सभी स्थिर क्षेत्र और निर्माता के साथ बॉयलरप्लेट कोड स्वचालित रूप से Kotlin द्वारा ध्यान रखा जाता है। आपको इनमें से कोई भी लिखना नहीं है।

कोटलिन कोड से आप इस ऑब्जेक्ट के उदाहरण को Foo के रूप में संदर्भित कर सकते हैं। जावा कोड से आप इस ऑब्जेक्ट के उदाहरण को Foo.INSTANCE के रूप में रेफर कर सकते हैं, क्योंकि कोटलिन कंपाइलर स्वचालित रूप से INSTANCE नामक संबंधित स्थिर फ़ील्ड बनाता है।

1

यदि आप जावा में कक्षा के शीर्ष पर स्टेटिक्स लिखने की शैली का पालन करते हैं, तो मैं कोटलिन में शीर्ष स्तर (जैसे वर्ग घोषणा से पहले) लिखने पर विचार करने का सुझाव देता हूं। कई उपयोग-मामले के लिए, यह बेहतर काम करता है वस्तु एक साथी को शुरू करने से

नमूना कोड:

class Person { 
    companion object Test { 
    fun callMe() = println("I'm called.") 
    } 
} 

fun main(args: Array<String>) { 
Person.callMe() 
} 

जब आप प्रोग्राम चलाने के लिए, उत्पादन होगा:

मैं कहा जाता रहा हूँ।

संबंधित मुद्दे