Kotlin se concentre sur la sécurité des types et évite les pointeurs nuls, mais il arrive souvent qu'il soit nécessaire d'initialiser des variables de manière tardive (late), par exemple lors de l'utilisation de l'injection de dépendances ou dans une activité Android. Pour cela, le modificateur lateinit a été ajouté.
Les propriétés ordinaires nécessitent une initialisation obligatoire ou doivent être nullables, ce qui est gênant lorsque l'initialisation tardive mais obligatoire est garantie. L'utilisation du type nullable complique le code et nécessite des vérifications null supplémentaires.
lateinit permet de créer une propriété non initialisée jusqu'à un certain point, mais de promettre au compilateur qu'elle sera initialisée avant la première utilisation. L'initialisation peut se faire non pas dans le constructeur, mais plus tard.
class UserViewModel { lateinit var repository: UserRepository fun onCreate() { repository = UserRepository() } fun getData() = repository.load() }
Caractéristiques clés :
Peut-on utiliser lateinit pour des propriétés val ?
Non. lateinit ne fonctionne qu'avec var, car val doit être initialisé une fois immédiatement ou via un getter.
Est-ce que lateinit fonctionne avec des types Int, Boolean, Double et d'autres primitifs ?
Non. Seulement avec des types de référence d'objet. Pour les primitifs, utilisez des types nullables.
Que se passe-t-il si on accède à une propriété lateinit avant son initialisation ?
Kotlin lancera UninitializedPropertyAccessException :
lateinit var foo: String println(foo) // Exception
Un développeur a déclaré lateinit var item: String, n'ayant pas initialisé avant le premier appel de la méthode getItem. Résultat : crash de l'application.
Avantages:
Inconvénients:
Activité Android : lateinit var presenter, initialisation dans onCreate. L'utilisation de presenter dans toutes les méthodes de cycle de vie est sécurisée : la nullabilité n'est pas nécessaire.
Avantages:
Inconvénients: