2016-06-24 16 views
11

मैं Kotlin में यह तरीकों लिखा है और बाईटकोड विश्लेषण किया:Kotlin वस्तु बनाम साथी-वस्तु पैकेज बनाम scoped तरीकों

स्थिति 1

class A { 
    object b { 
     fun doSomething() {} 
    } 
} 

स्थिति 2

class A { 
    companion object b { 
     fun doSomething() {} 
    } 
} 

स्थिति 3

fun doSomething() {} 

बाईटकोड परिणाम

  • स्थिति 1: वर्ग Test$asb, public final doSomething()I
  • स्थिति 2: कक्षा Test$Companion, public final doSomething()I
  • स्थिति 3: वर्ग TestKt, public final static doSomething()I

मेरे प्रश्न हैं:

  • मेरे पास एक enum क्लास है, और मैं एक enum variable को एक enum variable को वापस करना चाहता हूं, उदाहरण के लिए, ढूँढें ById (enum(id, color))। मैं यह कैसे करूंगा? सहयोगी वस्तु? आपत्ति?

  • क्लास घोषणा के बिना पैकेज स्तर में असली स्थिर विधि होने का एकमात्र तरीका लगता है। लेकिन यह थोड़ा सा वैश्विक बन जाता है। क्या इसका उपयोग करने के लिए कोई तरीका है: ClassName.staticMethod, staticMethod वास्तव में स्थिर है।

  • पैकेज घोषणा विधियों, साथी वस्तु और वस्तु के सार्थक उदाहरण प्रदान करें।

संदर्भ। मैं कोटलिन में कोडिंग कर रहा हूं और मुझे यह आश्चर्यजनक लगता है। लेकिन कभी-कभी मुझे निर्णय लेने की ज़रूरत होती है: उदाहरण के लिए, एक भारी अपरिवर्तनीय संपत्ति जो जावा में मैं स्थिर फाइनल के रूप में घोषित करता हूं, लेकिन कोटलिन में मुझे "समकक्ष ढूंढना" मुश्किल लगता है।

+0

परीक्षण करने के लिए हो सकता है कि यह हो सकता है सहायता {http://stackoverflow.com/q/37794850/2804610} – EPadronU

+0

रीगा में आपके पिछले अनुच्छेद के लिए आरडीएस, मुझे लगता है कि यह उत्तर आपको मदद कर सकता है {http://stackoverflow.com/a/37944990/2804610} – EPadronU

उत्तर

3

मैं voddan answer विकसित करने के लिए सुझाव है:

enum class Color { 

    RED, 
    BLUE, 
    GREEN; 


    companion object Utils { 
     fun findById(color: Color): Color { 
      return color; 
     } 
    } 
} 

और

@Test 
fun testColor() { 
    println(Color.Utils.findById(Color.valueOf("RED"))); 
} 
+3

क्यों 'रंग' वर्ग से प्रत्यक्ष कॉल नहीं? 'Println (Color.findById (Color.valueOf (" लाल ")));' – UnKnown

8

यदि आपके पास कोई ऐसा कार्य है जो किसी वर्ग से निकटता से संबंधित कुछ क्रिया करता है लेकिन कक्षा 0 के उदाहरण की आवश्यकता नहीं है, जैसे कि findById उदाहरण, आपको इसे कक्षा के साथी ऑब्जेक्ट में रखना चाहिए।

यदि आप जावा कोड के लिए एक स्थिर विधि के रूप में एक विधि का खुलासा करना चाहते हैं, तो आप इसे @JvmStatic एनोटेशन के साथ एनोटेट कर सकते हैं।

5

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

enum कई में निर्माण गुण और पैटर्न है ध्यान दें कि:

enum class Colour(val value: Int) { 
    black(100), red(200), green(300) 
} 

fun colourById(id: Int) = Colour.values[id] 
fun colourByValue(value: Int) = Colour.values.first {it.value == value} 
fun colourByName(name: String) = Colour.valueOf(name) 
संबंधित मुद्दे