Kotlin richt zich op typeveiligheid en het vermijden van null-verwijzingen, maar vaak ontstaat de behoefte aan uitgestelde (late) initialisatie van variabelen, bijvoorbeeld bij het gebruik van dependency injection of in Android Activity. Daarom is de lateinit-modifier toegevoegd.
Gewone eigenschappen vereisen verplichte initialisatie of moeten nullable zijn, wat ongemakkelijk is als er gegarandeerd late, maar verplichte initialisatie is. Het gebruik van nullable-types bemoeilijkt de code en vereist aanvullende null-controles.
lateinit stelt je in staat om een niet-geëinitialiseerde eigenschap te maken, maar beloven aan de compiler dat deze voor het eerste gebruik zal worden geïnitialiseerd. Initialisatie kan niet in de constructor, maar later gebeuren.
class UserViewModel { lateinit var repository: UserRepository fun onCreate() { repository = UserRepository() } fun getData() = repository.load() }
Belangrijke kenmerken:
Kun je lateinit gebruiken voor val-eigenschappen?
Nee. lateinit werkt alleen met var, omdat val onmiddellijk één keer moet worden geïnitialiseerd of via de getter.
Werkt lateinit met types Int, Boolean, Double en andere primitieve types?
Nee. Alleen met objectreferentietypes. Voor primitieve types gebruik nullable-types.
Wat gebeurt er als je toegang krijgt tot een lateinit-eigenschap voordat deze is geïnitialiseerd?
Kotlin gooit UninitializedPropertyAccessException:
lateinit var foo: String println(foo) // Exception
Een ontwikkelaar verklaarde lateinit var item: String, initieerde het niet vóór de eerste aanroep van de methode getItem. Resultaat: applicatiecrash.
Voordelen:
Nadelen:
Android Activity: lateinit var presenter, initialisatie in onCreate. Gebruik van presenter in alle levenscyclusmethoden is veilig: nullability is niet nodig.
Voordelen:
Nadelen: