W Kotlin, jeśli nie chcesz inicjować właściwości klasy wewnątrz konstruktora lub w górnej części ciała klasy, masz w zasadzie te dwie opcje (z odwołania do języka):
lazy () to funkcja, która pobiera lambda i zwraca instancję Lazy, która może służyć jako delegat do implementacji właściwości lazy: pierwsze wywołanie get () wykonuje lambda przekazane do lazy () i zapamiętuje wynik, kolejne wywołania get () po prostu zwraca zapamiętany wynik.
Przykład
public class Hello { val myLazyString: String by lazy { "Hello" } }
Tak więc pierwsze wywołanie i wywołania podrzędne, gdziekolwiek się znajdują, myLazyString zwrócą „Cześć”
Zwykle właściwości zadeklarowane jako niepuste muszą zostać zainicjowane w konstruktorze. Jednak dość często nie jest to wygodne. Na przykład właściwości można zainicjować przez wstrzyknięcie zależności lub w metodzie konfiguracji testu jednostkowego. W takim przypadku nie można podać w konstruktorze inicjatora o wartości innej niż NULL, ale nadal należy unikać sprawdzania wartości NULL podczas odwoływania się do właściwości wewnątrz ciała klasy.
Aby obsłużyć ten przypadek, możesz oznaczyć właściwość modyfikatorem lateinit:
public class MyTest { lateinit var subject: TestSubject @SetUp fun setup() { subject = TestSubject() } @Test fun test() { subject.method() } }
Modyfikatora można używać tylko w przypadku właściwości var zadeklarowanych w treści klasy (nie w głównym konstruktorze) i tylko wtedy, gdy właściwość nie ma niestandardowego programu pobierającego ani ustawiającego. Typ właściwości musi być różny od null i nie może być typem pierwotnym.
Jak więc właściwie wybrać jedną z tych dwóch opcji, skoro obie mogą rozwiązać ten sam problem?
lateinit
ujawnia swoje pole zaplecza z widocznością setera, więc sposoby dostępu do właściwości z Kotlin i Java są różne. Z kodu Java można ustawić tę właściwość nawetnull
bez sprawdzania w Kotlin. Dlategolateinit
nie jest do leniwej inicjalizacji, ale do inicjalizacji niekoniecznie z kodu Kotlin.