Ich frage mich, ob es eine Möglichkeit gibt, zu überprüfen, ob eine lateinit
Variable initialisiert wurde. Zum Beispiel:
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
}
}
File?
) und stattdessen überprüfen, ob sie null ist?allSeries
Var bearbeitenseriesDir?.listFiles()?.map { it.name }?.toTypedArray()
, was nicht sehr "hübsch" istif (seriesDir != null) {
allSeries = seriesDir.listFiles().map { it.name }.toTypedArray()
}
Antworten:
lateinit
In Kotlin 1.2 gibt es eine Verbesserung, mit der der Initialisierungsstatus derlateinit
Variablen direkt überprüft werden kann:Siehe die Ankündigung im JetBrains-Blog oder den KEEP-Vorschlag .
UPDATE: Kotlin 1.2 wurde veröffentlicht.
lateinit
Verbesserungen finden Sie hier:quelle
lateinit
auch für lokale Variablen zu verwenden, siehe kotlinlang.org/docs/reference/…::
vorherfile
?Mit der
.isInitialized
Eigenschaft kann der Initialisierungsstatus einer lateinit-Variablen überprüft werden.quelle
Versuchen Sie es zu verwenden und Sie erhalten eine,
UninitializedPropertyAccessException
wenn es nicht initialisiert ist.lateinit
ist speziell für Fälle gedacht, in denen Felder nach der Erstellung, jedoch vor der tatsächlichen Verwendung initialisiert werden (ein Modell, das die meisten Injection-Frameworks verwenden). Wenn dies nicht Ihr Anwendungsfall ist, ist dieslateinit
möglicherweise nicht die richtige Wahl.EDIT: Basierend auf dem, was Sie tun möchten, würde so etwas besser funktionieren:
quelle
lateinit
) wurde initialisiert. Mit anderen Worten: Ich möchte, dass die Schaltfläche deaktiviert wird, solange die Variable nicht initialisiert wurde. Gibt es eine gute Möglichkeit, das zu tun?isNull
Bindung verwenden, um die anderen Schaltflächen zu deaktivieren.Sie können dies einfach tun, indem Sie:
oder
Aber wenn Sie sich in einem Zuhörer oder einer inneren Klasse befinden, tun Sie Folgendes:
Hinweis: Die obigen Anweisungen funktionieren einwandfrei, wenn Sie sie in dieselbe Datei (dieselbe Klasse oder innere Klasse) schreiben, in der die Variable deklariert ist. Dies funktioniert jedoch nicht, wenn Sie die Variable einer anderen Klasse (nicht der Oberklasse oder deklariert in) überprüfen möchten eine andere Datei) , zum Beispiel:
Und um zu überprüfen, ob str initialisiert ist:
Was wir hier tun, um auf das Feld
str
derTest
Klasse in derTest2
Klasse zuzugreifen . Und wir bekommen ein Fehler-Backing-Feld von var ist derzeit nicht zugänglich. Überprüfen Sie eine bereits aufgeworfene Frage dazu.quelle
Akzeptierte Antwort gibt mir einen Compilerfehler in
Kotlin 1.3+
, ich musste dasthis
Schlüsselwort vorher explizit erwähnen::
. Unten ist der Arbeitscode.quelle
So überprüfen Sie, ob a
lateinit var
initialisiert wurde oder nicht, verwenden Sie a.isInitialized
für den Verweis auf diese Eigenschaft:quelle
::
vorherbar
?Bytecode sagt ... bla bla ..
L2 LOCALVARIABLE $ this Lcom / takharsh / ecdh / MainActivity; L0 L2 0 MAXSTACK = 2 MAXLOCALS = 1
Kotlin erstellt eine zusätzliche lokale Variable derselben Instanz und prüft, ob sie null ist oder nicht. Wenn null, wird 'throwUninitializedPropertyAccessException' ausgelöst. Andernfalls wird das lokale Objekt zurückgegeben. Oberhalb Bytecode erklärt hier Lösung Da Kotlin 1.2 es Wetter lateinit var initialisiert prüfen können , wurde oder nicht verwenden
.isInitialized
quelle