कोटलिन में यदि आप कंस्ट्रक्टर के अंदर या क्लास बॉडी के शीर्ष पर एक क्लास प्रॉपर्टी को इनिशियलाइज़ नहीं करना चाहते हैं, तो आपके पास मूल रूप से ये दो विकल्प हैं (भाषा संदर्भ से):
lazy () एक ऐसा फंक्शन है जो एक लैम्ब्डा लेता है और Lazy का एक उदाहरण देता है, जो एक आलसी प्रॉपर्टी को लागू करने के लिए एक प्रतिनिधि के रूप में काम कर सकता है: lazda (आलसी) को दिए गए पहले कॉल को निष्पादित करता है (और) परिणाम को याद करता है, बाद में कॉल करता है। प्राप्त करने के लिए () बस याद किए गए परिणाम को वापस करें।
उदाहरण
public class Hello { val myLazyString: String by lazy { "Hello" } }
तो पहली कॉल और सबक्शनल कॉल, जहां भी हो, myLazyString में "हैलो" वापस आ जाएगी
आम तौर पर, गैर-अशक्त प्रकार के रूप में घोषित संपत्तियों को कंस्ट्रक्टर में आरंभीकृत किया जाना चाहिए। हालाँकि, अक्सर यह सुविधाजनक नहीं होता है। उदाहरण के लिए, गुणों को निर्भरता इंजेक्शन के माध्यम से या एक इकाई परीक्षण के सेटअप विधि में शुरू किया जा सकता है। इस स्थिति में, आप कंस्ट्रक्टर में एक गैर-शून्य इनिशियलाइज़र की आपूर्ति नहीं कर सकते हैं, लेकिन आप अभी भी क्लास के शरीर के अंदर संपत्ति का संदर्भ देते समय अशक्त जांच से बचना चाहते हैं।
इस मामले को संभालने के लिए, आप संपत्ति को लेटीनिट संशोधक के साथ चिह्नित कर सकते हैं:
public class MyTest { lateinit var subject: TestSubject @SetUp fun setup() { subject = TestSubject() } @Test fun test() { subject.method() } }
संशोधक का उपयोग केवल वर्ग के शरीर के अंदर घोषित प्राथमिक गुणों पर किया जा सकता है (प्राथमिक निर्माणकर्ता में नहीं), और केवल तब जब संपत्ति में कस्टम गेट्टर या सेटर न हो। संपत्ति का प्रकार गैर-अशक्त होना चाहिए, और यह एक आदिम प्रकार नहीं होना चाहिए।
तो, इन दो विकल्पों के बीच सही तरीके से कैसे चयन करें, क्योंकि दोनों एक ही समस्या को हल कर सकते हैं?
lateinit
सेटर की दृश्यता के साथ इसके बैकिंग क्षेत्र को उजागर किया जाए ताकि संपत्ति कोटलिन से और जावा से अलग तरीके से एक्सेस किया जा सके। और जावा कोड से यह संपत्तिnull
कोटलिन में बिना किसी चेक के भी सेट की जा सकती है । इसलिएlateinit
आलसी इनिशियलाइजेशन के लिए नहीं है, लेकिन इनिशियलाइजेशन के लिए जरूरी नहीं कि कोटलिन कोड से।