Vous pouvez déclarer un late final
variable.
Si vous le déclarez avec un initialisateur, late final foo = computeSomething();
alors il s'agit d'une variable finale paresseuse. Vous ne pouvez pas assigner à la variable, mais sa valeur n'est calculée que la première fois que la variable est lue. (Dans mon expérience, ce n'est jamais le bon choix pour local même si le langage le permet. Si vous vous souciez de l'initialisation paresseuse d'une variable locale, vous voulez aussi presque toujours connaître si elle a été initialisée, et une variable paresseuse ne vous donne pas cette information. Il est également déroutant que le code soit exécuté dans le désordre et qu'il ne permette pas d'utiliser la fonction await
dans l'expression de l'initialisateur).
Si vous déclarez un late final
variable sans un initialisateur, vous êtes autorisé à écrire dans la variable une fois . Parce que la variable est late
le compilateur ne se plaindra pas des affectations au moment de la compilation, sauf s'il est absolument certain que vous avez déjà affecté la variable, et seulement s'il s'agit d'une variable locale (parce que ce sont les seules variables pour lesquelles le compilateur tente de suivre les affectations).
Si le late final
sans initialisateur est un membre d'instance d'une classe, cela signifie que l'interface de la classe a un setter. Vous devez faire très, très attention à ne pas exposer late final
dans l'API publique d'une classe. (Lire : Ne faites pas ça !)
Il est préférable d'utiliser les variables tardives en interne et de protéger l'accès aux champs, afin de s'assurer que personne n'affecte la variable deux fois. Le but d'une variable finale tardive n'est pas d'être rejetée si elle est assignée deux fois. Elle ne devrait jamais être assignée deux fois. Elle est là pour permettre au code qui connaît pour une raison que le compilateur ne peut pas comprendre, que la variable n'est assignée qu'une fois. Donc, ne permettez l'accès aux variables finales tardives qu'au code qui est conscient de cette raison, et qui maintient l'invariant.