2016-08-04 51 views
19

कोटलिन भाषा में, डिफ़ॉल्ट रूप से, जब इसे पेश किया जाता है तो प्रत्येक चर को प्रारंभ करना होता है। इससे बचने के लिए, lateinit कीवर्ड का उपयोग किया जा सकता है। एक रनटाइम अपवाद में परिणामों को आरंभ करने से पहले lateinit वैरिएबल का जिक्र करते हुए।कोटलिन क्यों प्राचीन प्रकार के साथ देर से उपयोग करने की अनुमति नहीं देता है?

lateinit, हालांकि, आदिम प्रकारों के साथ उपयोग नहीं किया जा सकता है। ऐसा क्यों है?

उत्तर

16

वस्तु प्रकार के लिए, Kotlin चिह्नित करने के लिए है कि एक lateinit संपत्ति प्रारंभ नहीं किया गया है और उचित अपवाद फेंक null मान का उपयोग करता है जब संपत्ति का उपयोग किया जाता है।

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

इसलिए, lateinit केवल ऑब्जेक्ट प्रकारों के गुणों के लिए समर्थित है।

+31

क्या आप उत्तर में स्पष्टीकरण दे सकते हैं, क्यों 'देर से इंट' को रनटाइम में 'इंटेगर' प्रकार के साथ प्रदर्शित नहीं किया जा सकता है, जो प्रारंभ नहीं होने पर 'शून्य' मान धारण करने में सक्षम है? – Ilya

+0

@ इलिया क्योंकि एक 'इंटीगर' एक 'int' नहीं है। यह एक बॉक्सिंग प्रकार है, और यह महत्वपूर्ण रूप से या प्रतिबिंब के माध्यम से सामान सेट करते समय महत्वपूर्ण है। –

+2

तो, मुझे लगता है कि कोटलिन ऑब्जेक्ट करने के लिए आदिम प्रकारों को लपेटता है (उदाहरण के लिए int int int)। हालांकि, इंट क्यों शून्य नहीं हो सकता क्योंकि यह एक वस्तु है? इसके अलावा, हम एक पैरामीटर को निरर्थक और देर से क्यों नहीं घोषित कर सकते हैं? (var x: Int?) – Yao

1

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

वास्तव में, जब तक कि यह एक मूल्य है के रूप में सबसे पहले पहुंच Kotlin में एक चर आरंभ से पहले की कोई आवश्यकता नहीं है और यह स्थिर साबित कर दिया जा सकता है। इसका मतलब है इस कोड को पूरी तरह से वैध है:

fun main(args: Array<String>) { 
    var x: Int 
    val y: Double 

    x = 0 
    y = x + 0.1 

    println("$x, $y") 
} 

लेकिन वहाँ (दुर्लभ) मामले ऐसे हैं जहां initialisation स्थिर साबित नहीं किया जा सकता है। सबसे सामान्य रूप में एक वर्ग क्षेत्र है जो निर्भरता इंजेक्शन के किसी भी रूप का उपयोग करता है:

class Window { 
    @Inject lateinit parent: Parent 
} 
संबंधित मुद्दे

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