En Kotlin, si vous ne voulez pas initialiser une propriété de classe à l'intérieur du constructeur ou en haut du corps de la classe, vous avez essentiellement ces deux options (à partir de la référence du langage) :
lazy()
est une fonction qui prend un lambda et renvoie une instance deLazy
qui peut servir de délégué pour implémenter une propriété paresseuse : le premier appel àget()
exécute le lambda passé àlazy()
et se souvient du résultat, les appels suivants àget()
retournent simplement le résultat mémorisé.Exemple
public class Hello { val myLazyString: String by lazy { "Bonjour" } }
Ainsi, le premier appel et les appels ultérieurs, où qu'ils soient, à myLazyString
retourneront Bonjour
Normalement, les propriétés déclarées comme ayant un type non nul doivent être initialisées dans le constructeur. Cependant, assez souvent cela n'est pas pratique. Par exemple, les propriétés peuvent être initialisées via l'injection de dépendances, ou dans la méthode de configuration d'un test unitaire. Dans ce cas, vous ne pouvez pas fournir un initialiseur non nul dans le constructeur, mais vous voulez quand même éviter les vérifications nulles lors de la référence à la propriété à l'intérieur du corps d'une classe.
Pour gérer ce cas, vous pouvez marquer la propriété avec le modificateur lateinit :
public class MyTest { lateinit var subject: TestSubject @SetUp fun setup() { subject = TestSubject() } @Test fun test() { subject.method() } }
Le modificateur ne peut être utilisé que sur des propriétés var déclarées à l'intérieur du corps d'une classe (pas dans le constructeur principal), et seulement lorsque la propriété n'a pas de getter ou setter personnalisé. Le type de la propriété doit être non nul, et il ne doit pas s'agir d'un type primitif.
Donc, comment choisir correctement entre ces deux options, puisqu'elles peuvent toutes les deux résoudre le même problème ?