Zastanawiam się, czy istnieje sposób sprawdzenia, czy lateinit
zmienna została zainicjowana. Na przykład:
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?
stała się pusta (zmień typ na ) i po prostu sprawdź, czy zamiast niej jest pusta?allSeries
varseriesDir?.listFiles()?.map { it.name }?.toTypedArray()
, co nie jest zbyt „ładne”if (seriesDir != null) {
allSeries = seriesDir.listFiles().map { it.name }.toTypedArray()
}
Odpowiedzi:
Jest
lateinit
poprawa w Kotlin 1.2, która pozwala sprawdzić stan inicjalizacjilateinit
zmiennej bezpośrednio:Zobacz ogłoszenie na blogu JetBrains lub propozycję KEEP .
AKTUALIZACJA: Kotlin 1.2 został wydany.
lateinit
Ulepszenia można znaleźć tutaj:źródło
lateinit
również do zmiennych lokalnych, patrz kotlinlang.org/docs/reference/…::
przedtemfile
?Za pomocą
.isInitialized
właściwości można sprawdzić stan inicjalizacji zmiennej lateinit.źródło
Spróbuj go użyć, a otrzymasz,
UninitializedPropertyAccessException
jeśli nie zostanie zainicjowany.lateinit
jest szczególnie przeznaczony do przypadków, w których pola są inicjowane po budowie, ale przed faktycznym użyciem (model używany przez większość platform wstrzykiwania). Jeśli tak nie jest, twój przypadek użycialateinit
może być niewłaściwy.EDYCJA: Na podstawie tego, co chcesz zrobić, coś takiego działałoby lepiej:
źródło
lateinit
) została zainicjowana. Innymi słowy: chcę, aby przycisk był wyłączony, dopóki zmienna nie zostanie zainicjowana. Czy jest na to dobry sposób?isNull
powiązania, aby wyłączyć inne przyciski.Możesz to łatwo zrobić:
lub
Ale jeśli jesteś w słuchaczu lub klasie wewnętrznej, zrób to:
Uwaga: powyższe instrukcje działają poprawnie, jeśli zapisujesz je w tym samym pliku (tej samej klasie lub klasie wewnętrznej), w którym deklarowana jest zmienna, ale to nie zadziała, jeśli chcesz sprawdzić zmienną innej klasy (nie nadklasy lub zadeklarowanej w inny plik) , na przykład:
I aby sprawdzić, czy str jest zainicjowany:
Co my tu robimy dostępu pola
str
wTest
klasie wTest2
klasie. I otrzymujemy błąd, że pole var nie jest w tym momencie dostępne. Sprawdź już zadane pytanie na ten temat.źródło
Zaakceptowana odpowiedź powoduje błąd kompilatora
Kotlin 1.3+
, musiałem wcześniej wyraźnie wspomnieć o tymthis
słowie kluczowym::
. Poniżej znajduje się działający kod.źródło
Aby sprawdzić, czy
lateinit var
zostały zainicjowane, czy nie, użyj.isInitialized
odwołania do tej właściwości:źródło
::
przedtembar
?Bytecode mówi ... bla bla ...
L2 LOCALVARIABLE $ this Lcom / takharsh / ecdh / MainActivity; L0 L2 0 MAKSYMALNY = 2 MAKSYMALNE = 1
Kotlin tworzy dodatkową lokalną zmienną tej samej instancji i sprawdza, czy jest null, czy nie, jeśli null, wówczas „throwUninitializedPropertyAccessException” inaczej zwróci obiekt lokalny. Powyżej kodu bajtowego wyjaśnione tutaj rozwiązanie, ponieważ Kotlin 1.2 pozwala na sprawdzenie pogody lateinit var został zainicjowany lub nie stosując
.isInitialized
źródło