Kotlin चर प्रारंभ नीति कठोर है, और यह अब चर संदर्भ के लिए निषिद्ध है अपने प्रारंभिक यंत्र के अंदर, यहां तक कि लैम्ब्डा और ऑब्जेक्ट एक्सप्रेशन में भी, जो उचित लगता है: कल्पना करें कि परिवर्तनीय असाइनमेंट से पहले लैम्ब्डा को तुरंत बुलाया जाता है।
अपने मामले के लिए, मैं यह काफी बोझिल निर्माण में एक object expression का उपयोग कर एक समाधान के रूप का सुझाव कर सकते हैं:
val textToSpeech = object {
val value: TextToSpeech get() = inner
private val inner = TextToSpeech(
applicationContext,
{ value.setLanguage(Locale.UK) }
)
}.value
यह inner
साथ एक अनाम वस्तु प्रारंभ हो जाएगा अंदर कि value
संपत्ति के माध्यम से स्वीकार्य है। ध्यान दें कि inner
प्रारंभकर्ता value
संपत्ति का उपयोग करता है। फिर value
निकाला जाता है और इसका उपयोग किया जा सकता है।
लेकिन कृपया ध्यान रखें कि इस चाल असुरक्षित है: पहले inner
असाइन किया गया है, क्रम में value
का उपयोग कर (जैसे TextToSpeech
निर्माता में) NullPointerException
फेंक देते हैं।
इसके अलावा, मैंने OnInitListener
को SAM conversion का उपयोग करके लैम्ब्डा के साथ छोटा करने के लिए प्रतिस्थापित किया है, लेकिन ऑब्जेक्ट अभिव्यक्ति का अभी भी उपयोग किया जा सकता है।
यूपीडी: इस दृष्टिकोण को सामान्य बनाने के मेरे प्रयास के लिए
this question देखें। इसका उपयोग करके, आप
val textToSpeech = selfReference {
TextToSpeech(
applicationContext,
{ self.setLanguage(Locale.UK) }
)
}
sources on Github देखें।