संपत्ति को प्रारंभिक या सार होना चाहिए


121

यह मूर्खतापूर्ण प्रश्न होना चाहिए, लेकिन मैं वास्तव में कोटलिन के लिए नया हूं और मुझे कोई समाधान नहीं मिला।

क्लास फील्ड कैसे घोषित करें? जैसे हम इसे जावा में रख सकते हैं:

protected SharedPreferences mSharedPreferences;

और बाद में onCreate():

mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)

अब मैं इसे कहीं भी उपयोग कर सकता हूं जो मैं चाहता हूं (इस आधार गतिविधि के उपवर्गों में)।

मैं कोटलिन में ऐसा ही करने की कोशिश करता हूं:

protected var sharedPreferences : SharedPreferences

और में onCreate():

sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)

लेकिन मुझे एक चेतावनी मिलती है: "संपत्ति को प्रारंभिक या सार होना चाहिए"

जवाबों:


188

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

protected lateinit var sharedPreferences: SharedPreferences

12
मैंने "संरक्षित var साझाकरणों का उपयोग करने का प्रयास किया है: साझाकरण: = शून्य" और यह भी काम करता है, क्या अंतर है?
एंटोन Shkurenko

मैं देखता हूं कि अगर मैं DI के लिए Dagger2 का उपयोग करता हूं, तो मुझे आपके संस्करण का उपयोग करना होगा, है ना?
एंटोन Shkurenko

30
अंतर यह है कि आप लेटिनिट के साथ गैर-अशक्त मूल्यों की घोषणा कर सकते हैं।
किरिल रहमान

15

दृश्यता के लिए अलेक्जेंडर उडालोव के जवाब से टिप्पणियों को बाहर खींचते हुए। अशक्त गुणों के लिए:

protected var sharedPreferences : SharedPreferences? = null

... और इसे बाद में मान दें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.