"लेटइनिट" वैरिएबल को इनिशियलाइज़ किया गया है या नहीं, इसकी जाँच कैसे करें?


428

मुझे आश्चर्य है कि अगर एक lateinitचर को इनिशियलाइज़ किया गया है तो जाँचने का कोई तरीका है। उदाहरण के लिए:

class Foo() {

    private lateinit var myFile: File

    fun bar(path: String?) {
        path?.let { myFile = File(it) }
    }

    fun bar2() {
        myFile.whateverMethod()
        // May crash since I don't know whether myFile has been initialized
    }
}

3
हो सकता है कि आपको संपत्ति File?को अशक्त (परिवर्तन प्रकार ) बनाने के लिए और सिर्फ यह जांचने की आवश्यकता है कि क्या यह इसके बजाय शून्य है?
Marcin Koziński

1
ठीक है, मैंने वास्तव में कोशिश की थी और यह चाल चलेगा, हालांकि मुझे उस allSeriesसंस्करण को संपादित करना होगा seriesDir?.listFiles()?.map { it.name }?.toTypedArray(), जो बहुत "सुंदर" नहीं है
मैथ्यू हनी

1
आप एक सादे पुराने नल की जांच कर सकते हैं और स्मार्ट कास्ट इसे सुंदर बना देगा। if (seriesDir != null) { allSeries = seriesDir.listFiles().map { it.name }.toTypedArray() }
मैरिन कोज़िस्की

जवाबों:


977

lateinitकोटलिन 1.2 में एक सुधार है जो lateinitचर की प्रारंभिक स्थिति को सीधे जांचने की अनुमति देता है :

lateinit var file: File    

if (this::file.isInitialized) { ... }

JetBrains ब्लॉग या KEEP प्रस्ताव पर घोषणा देखें ।

अद्यतन: कोटलिन 1.2 जारी किया गया है। आप lateinitयहां एन्हांसमेंट पा सकते हैं :


3
@ fer.marino: खैर, कोटलिन 1.2 वास्तव में आपको lateinitस्थानीय चरों के लिए भी उपयोग करने की अनुमति देता है , kotlinlang.org/docs/reference/…
xsveda

9
यह :: lateinitVar.isInitialized
विहकत

17
::पहले का क्या अर्थ है file?
मालविंदर सिंह

5
@MalwinderSingh यह एक सदस्य संदर्भ या एक वर्ग संदर्भ बनाता है।
NotGeek

5
कोटलिन के साथ प्यार में
नावेद अहमद

46

.isInitializedसंपत्ति का उपयोग करना किसी लेटीनिट वैरिएबल की आरंभीकरण स्थिति की जांच कर सकता है।

if(::file.isInitialized){
    //File is initialized
}else{
    //File is not initialized
}

यह प्रश्न का उत्तर प्रदान नहीं करता है। एक लेखक से स्पष्टीकरण की आलोचना करने या अनुरोध करने के लिए, उनके पोस्ट के नीचे एक टिप्पणी छोड़ दें। - समीक्षा से
gforce301

2
@ gforce301 यह निश्चित रूप से जाँच के लिए उपयोग किया जाएगा।
निखिल कटेखाई

39

इसे उपयोग करने का प्रयास करें और UninitializedPropertyAccessExceptionयदि यह आरंभिक नहीं है तो आपको प्राप्त होगा ।

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

संपादित करें: आप इस तरह से कुछ करना चाहते हैं उसके आधार पर बेहतर काम करेगा:

val chosenFile = SimpleObjectProperty<File?>
val button: Button

// Disables the button if chosenFile.get() is null
button.disableProperty.bind(chosenFile.isNull())

मेरे पास एक JavaFX एप्लिकेशन है, और मेरे पास एक बटन है जो हमेशा तब तक निष्क्रिय रहेगा जब तक कि एक वैरिएबल (जो है lateinit) को प्रारंभ नहीं किया गया है। दूसरे शब्दों में: मैं चाहता हूं कि बटन तब तक अक्षम रहे जब तक कि वैरिएबल को प्रारंभ नहीं किया गया हो। क्या ऐसा करने का कोई अच्छा तरीका है?
मैथ्यू हनी

@MathewHany इसे सामान्य रूप से कैसे आरंभ किया जाएगा? आप संपत्ति पाने वाले / बसने वालों और एक SimpleBooleanProperty को देखना चाहते हैं, जिसे आप बटन की अक्षम संपत्ति में बाँध सकते हैं
Kiskae

1
अधिक विशिष्ट होने के लिए, मेरे पास एक साधारण ऐप है जिसमें 4 बटन हैं, पहला बटन एक डायरेक्टरीचोरर डायलॉग खोलेगा, और दूसरा 3 अक्षम हो जाएगा, जब उपयोगकर्ता एक निर्देशिका का चयन करेगा तो अन्य सभी बटन उपयोगकर्ता के लिए उपलब्ध होंगे।
मैथ्यू हनी

@ मैथ्यू आप मूल रूप से कार्यान्वित कर सकते हैं कि एक SimpleObjectProperty का उपयोग करके चुनी हुई फ़ाइल को पकड़ें, फिर isNullअन्य बटनों को अक्षम करने के लिए बाइंडिंग का उपयोग करें ।
०६ पर किसके

1
kotlinlang.org/docs/reference/… xsveda उत्तर आज तक अधिक है
सर्ज

18

आप इसे आसानी से कर सकते हैं:

::variableName.isInitialized

या

this::variableName.isInitialized

लेकिन अगर आप एक श्रोता या आंतरिक वर्ग के अंदर हैं, तो यह करें:

this@YourClassName::variableName.isInitialized

नोट: उपरोक्त कथन ठीक काम करते हैं यदि आप उन्हें उसी फ़ाइल (उसी वर्ग या आंतरिक वर्ग) में लिख रहे हैं जहाँ चर घोषित किया गया है, लेकिन यह तब काम नहीं करेगा जब आप अन्य वर्ग के चर की जाँच करना चाहते हैं (सुपरक्लास में या घोषित नहीं अन्य फ़ाइल) , पूर्व के लिए:

class Test {
    lateinit var str:String
}

और यह जांचने के लिए कि क्या आरंभीकृत है:

यहां छवि विवरण दर्ज करें

हम यहाँ क्लास में क्लास strकी पहुँच के क्षेत्र में क्या कर रहे हैं । और हमें एक त्रुटि मिलती है var का बैकिंग क्षेत्र इस बिंदु पर सुलभ नहीं है। इस बारे में पहले से उठाए गए एक प्रश्न की जाँच करें।TestTest2


12

स्वीकृत उत्तर मुझे एक संकलक त्रुटि देता है Kotlin 1.3+, मुझे पहले स्पष्ट रूप से thisकीवर्ड का उल्लेख करना था ::। नीचे वर्किंग कोड है।

lateinit var file: File

if (this::file.isInitialized) {

    // file is not null
}

मैं एक स्थानीय init वैरिएबल का उपयोग कर रहा हूं जब मैं इस चेक का उपयोग करता हूं जो अनसुलझे संदर्भ की तरह एक त्रुटि देता है
MarGin

3

यह जाँचने के लिए कि lateinit varक्या प्रारंभिक .isInitializedसंपत्ति थी या उस संपत्ति के संदर्भ में उपयोग नहीं की गई थी :

if (foo::bar.isInitialized) {
    println(foo.bar)
}

यह जाँच केवल उन्हीं गुणों के लिए उपलब्ध है, जो लेक्सिक रूप से सुलभ हैं, यानी एक ही प्रकार या बाहरी प्रकारों में, या एक ही फ़ाइल में शीर्ष स्तर पर घोषित किए गए हैं।


1
::पहले का क्या अर्थ है bar?
मालविंदर सिंह

@ मलविंदर सिंह "एक सदस्य संदर्भ या एक वर्ग संदर्भ बनाता है"
कोटलिन

0
kotlin.UninitializedPropertyAccessException: lateinit property clientKeypair has not been initialized

बायटेकोड कहता है ... ब्ला ब्ला ।।

public final static synthetic access$getClientKeypair$p(Lcom/takharsh/ecdh/MainActivity;)Ljava/security/KeyPair;

`L0
LINENUMBER 11 L0
ALOAD 0
GETFIELD com/takharsh/ecdh/MainActivity.clientKeypair : Ljava/security/KeyPair;
DUP
IFNONNULL L1
LDC "clientKeypair"
INVOKESTATIC kotlin/jvm/internal/Intrinsics.throwUninitializedPropertyAccessException (Ljava/lang/String;)V
    L1
ARETURN

L2 LOCALVARIABLE $ इस Lcom / takharsh / ecdh / MainActivity; L0 L2 0 MAXSTACK = 2 MAXLOCALS = 1

कोटलिन एक ही उदाहरण का एक अतिरिक्त स्थानीय चर बनाता है और यह जाँचता है कि यह शून्य है या नहीं, यदि अशक्त है तो 'थ्रोइनिनिटलाइज्डप्रोपरेट्टीएस्टेसेप्शन' को फेंकता है और स्थानीय वस्तु को लौटाता है। ऊपर bytecode यहाँ समझाया समाधान kotlin 1.2 के बाद से मौसम की जांच करने की अनुमति देता है लेटीनिट संस्करण को इनिशियलाइज़ किया गया है या उपयोग नहीं किया गया है.isInitialized

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