2017-06-28 7 views
10

मैं देर से और नाली परिवर्तनीय के लिए भ्रमित हूं, जो चर के लिए उपयोग करने के लिए एक है।कोटलिन - "देर से" और "शून्य परिवर्तनीय" के बीच कैसे निर्णय लें?

lateinit var c: String 
var d: String? = null 
c = "UserDefinedTarget" 

// if not added initialisation for c than throws UninitializedPropertyAccessException 
if (c == "UserDefinedTarget") { 
    //do some stuff. 
} 
//not throws any exception whether d is initialise or not. 
if(d == "UserDefinedTarget") { 
    //do some stuff 
} 
+0

वे पूरी तरह से अलग हैं, इसी तरह की अवधारणा के बीच एक वास्तविक अंतर देर से और आलसी के बीच हो सकता है लेकिन देर से और नामुमकिन गुणों के बीच नहीं हो सकता है। इस प्रश्न का कोई मतलब नहीं है – MatPag

+1

यदि आप पूरी तरह से सुनिश्चित हैं कि उपयोग किए जाने से पहले एक चर प्रारंभ किया जाएगा। आप देर से उपयोग कर सकते हैं। अन्यथा शून्य परिवर्तनीय चर का प्रयोग करें –

उत्तर

8

एक प्रकार है कि नुल है योग्यता सिर्फ यही है, एक ऐसी चीज जिसमें वैध स्थिति है जो शून्य है।

एक गैर-शून्य से देर से init var कुछ ऐसा प्रतिनिधित्व करता है जहां शून्य एक अमान्य स्थिति है, लेकिन किसी कारण से आप इसे कन्स्ट्रक्टर में पॉप्युलेट नहीं कर सकते हैं।

Android गतिविधियां देर से उपयोग के लिए एक अच्छा उदाहरण हैं। क्रियाकलापों में कोई तर्क कन्स्ट्रक्टर नहीं होना चाहिए और उनका जीवन चक्र केवल वास्तव में क्रिएट() पर शुरू होता है।

8

इन दो पूरी तरह से अलग अवधारणाओं रहे हैं।

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

हालांकि, आपको यह ध्यान में रखना चाहिए कि lateinit संपत्ति को प्रारंभ करने से पहले संपत्ति को अपवाद फेंकता है। इसका मतलब है कि आपको केवल तभी उपयोग करना चाहिए यदि आप पूरी तरह से सुनिश्चित हैं, तो वे प्रारंभ किए जाएंगे।

Nullable प्रकार, दूसरे हाथ पर, उपयोग किया जाता है जब एक चर null पकड़ कर सकते हैं।


class A { 
    lateinit var a: String 

    fun cat() { 
     print(a.length) // UninitializedPropertyAccessException is thrown 
     a = "cat" 
     print(a.length) // >>> 3 
    } 
} 

class B { 
    var b: String? = null 

    fun dog() { 
     print(b.length) // won't compile, null check is obligatory here 
     print(b?.length) // >>> null 
     b = "dog" 
     print(b?.length) // >>> 3 
    } 
} 

अधिक जानकारी के लिए:

5

यह निर्भर करता है। Nullable चर का अर्थ है कि चर मूल्य या शून्य पकड़ सकते हैं। lateinit का अर्थ है कि परिवर्तनीय बाद में आरंभ किया जाना चाहिए। इसे एक्सेस करने से पहले इसे प्रारंभ किया जाना चाहिए। यदि आप uninitialized lateinit परिवर्तनीय UninitializedPropertyAccessException को फेंकने का प्रयास करते हैं तो उसे फेंक दिया जाएगा।

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

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

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

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