Dans Kotlin, si vous ne voulez pas initialiser une propriété de classe à l'intérieur du constructeur ou en haut du corps de classe, vous avez essentiellement ces deux options (à partir de la référence de langage):
lazy () est une fonction qui prend un lambda et retourne une instance de Lazy qui peut servir de délégué pour implémenter une propriété lazy: le premier appel à get () exécute le lambda passé à lazy () et se souvient du résultat, les appels suivants get () renvoie simplement le résultat mémorisé.
Exemple
public class Hello { val myLazyString: String by lazy { "Hello" } }
Ainsi, le premier appel et les appels secondaires, où qu'ils se trouvent, à 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, cela n'est souvent 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 toujours éviter les vérifications nulles lors du référencement de 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 les propriétés var déclarées à l'intérieur du corps d'une classe (pas dans le constructeur principal), et uniquement lorsque la propriété n'a pas de getter ou de setter personnalisé. Le type de la propriété doit être non nul et ne doit pas être un type primitif.
Alors, comment choisir correctement entre ces deux options, car les deux peuvent résoudre le même problème?
lateinit
expose son champ de support avec la visibilité du setter, de sorte que les façons d'accéder à la propriété depuis Kotlin et depuis Java sont différentes. Et à partir du code Java, cette propriété peut être définie mêmenull
sans aucun contrôle dans Kotlin. Par conséquent, celateinit
n'est pas pour l'initialisation paresseuse mais pour l'initialisation pas nécessairement à partir du code Kotlin.