2 votes

Peut-on utiliser les termes "tard" et "final" ensemble ?

Je suis en train d'essayer NNBD et j'aimerais savoir si vous pouvez utiliser le nouveau mot-clé. late y final ensemble.

D'après ce que j'ai compris, un late peut être définie n'importe où. En fait, vous dites à l'analyseur qu'elle ne sera pas nulle lorsqu'elle sera utilisée.
Je pense que c'est un peu dangereux dans certaines situations.

Je me demande donc si vous pouvez ajouter un late final en NNBD, cela indiquerait à l'analyseur que la propriété doit être initialisée dans le constructeur de la classe.

Il y a une question similaire mais je suppose qu'il n'y avait pas de sécurité nulle à l'époque : Flèche. Initialisation tardive des variables finales

2voto

lrn Points 8630

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.

0voto

Nicholas Spencer Points 200

Réponse courte : Non, l'analyseur ne vous sera d'aucune aide.


Extrait de la spécification du langage nnbd :

C'est une erreur si une variable de niveau supérieur ou une variable statique avec une valeur type non nul n'a pas d'expression d'initialisation, à moins que la variable ne soit marquée par un modificateur tardif ou externe.

C'est une erreur si une déclaration de classe déclare une variable d'instance avec un type potentiellement non nul et sans expression d'initialisation, et que la classe possède un constructeur génératif où la variable n'est pas initialisée via une expression initialisatrice ou une entrée de liste d'initialisateurs, sauf si la variable est marquée par un modificateur tardif, abstrait ou externe. externe.

late final int foo; En fait, il n'y a plus de conscience de la nullité pour foo . Cela semble être l'équivalent de l'utilisation d'optionnels implicitement unwrapped dans Swift, ce qui peut être dangereux, si vous êtes familier avec cela.

https://github.com/dart-lang/language/blob/master/accepted/future-releases/nnbd/feature-specification.md

En outre, l'analyseur statique ne vous prévient pas si vous essayez de réinitialiser un fichier late final .

Soit D un late y final déclaration d'une variable locale nommée v . Il s'agit d'une erreur d'exécution, qui lance une instance de LateInitializationError pour attribuer une valeur à v si une valeur a été précédemment attribuée à v .

https://github.com/dart-lang/language/blob/master/accepted/future-releases/nnbd/feature-specification.md#late-fields-and-variables

Utilisation de late signifie que vous devez savoir exactement quand les choses sont initialisées et utilisées.

0voto

CopsOnRoad Points 4705

Oui !

Vous pouvez voir ce modèle couramment utilisé lors de l'initialisation AnimationController .

class _MyState extends State<MyPage> with SingleTickerProviderStateMixin {
  late final AnimationController _controller;

  @override
  void initState() {
    super.initState();
    _controller = AnimationController(vsync: this);
  }
}

Et vous pouvez l'utiliser pour une initialisation paresseuse, comme :

class Foo {
  late final int i = calculate; // Initialized only when used.

  int get calculate => ...;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X