¿Necesita utilizar la palabra clave "nueva" en Dart?

94

En mi aplicación basada en Dart, acabo de notar que puedo omitir la newpalabra clave y todo funciona perfectamente bien.

En lugar de final widget = new Widget();también puedo usar final widget = Widget();.

¿Tiene esto algún efecto en el código?

creativecreatorormaybenot
fuente

Respuestas:

119

No, no lo hace. Con Dart 2 (haga clic para ver el anuncio con más información) las palabras clave newy también constse hicieron opcionales .

Esto significa que new Widget()hace exactamente lo mismo que Widget()por sí solo.


La constpalabra clave puede, sin embargo, cambiar un valor que no sería una constforma implícita a una const.
Por lo tanto, tendrá que especificar explícitamente constcuándo es necesario.

creativecreatorormaybenot
fuente
6
El equipo dardo tuvo que retractarse un poco por ahora y hay algunas situaciones en las que newo consttodavía son necesarios (no me acuerdo ejemplos o reglas). Es posible que hagan otro intento después de Dart 2 para que sea opcional en todas partes.
Günter Zöchbauer
1
No hay lugares donde newse requiera. Si omite newde un programa correcto, siempre seguirá funcionando de la misma manera. Si se quita constde un programa de trabajo, a continuación, en la mayoría de los casos en los que le tienen que escribir constpara que el programa sea válida, seguirá siendo válida. Siempre que ya haya un constalrededor de la expresión, puede omitir la const anidada.
2018
20

En Dart 2, si invoca un constructor como una función, sin newo constal frente, entonces es equivalente a usar new. Si desea una invocación constante, debe poner constal frente.

Dentro de una expresión const, no es necesario volver a escribir const, y en algunos contextos que requieren expresiones const (como expresiones de cambio de mayúsculas y minúsculas e inicializadores de variables const), ni siquiera necesita la const externa.

Así que no necesitas escribir nunca new.

El equipo de lenguaje de Dart quiere permitir expresiones en las que puede insertar newo consty que la invocación sea correcta (es decir, un constructor constante con argumentos constantes) para que se inserten de forma predeterminada en constlugar de new, con suerte, en una actualización temprana de Dart 2. Por esa razón , Recomiendo escribirlo newdelante de Object(), o cualquier otro constructor constante donde necesite que el objeto sea una nueva instancia. Ese es un caso muy raro, por lo general no le importa la identidad de su objeto inmutable (razón por la cual insertar constse considera una buena idea).

lrn
fuente
5

La newpalabra clave se hizo opcional en Dart 2. A partir de ahora, llamar a una clase siempre devolverá una nueva instancia de esa clase. Según mi recomendación, puede usarlo ( NO OBLIGATORIO ) fuera de una definición de diseño, pero omitirlo en diseños internos.

Un punto más que me gustaría compartir con ustedes es que si usa la palabra clave newo constmientras declara widgets , también puede ver el ícono + que puede usar para contraer y expandir el código del cuerpo del widget. Esto es útil cuando desea contraer / ocultar el código del widget restante en el archivo dart mientras trabaja en otro código del widget en el mismo archivo.

Rahul Sharma
fuente
Buena captura sobre ese colapso
MoGa
2
El comportamiento de colapso sería específico de IDE. Debe indicar explícitamente a cuál (s) se aplica.
jamesdlin
1
Además, "llamar a una clase" (con lo que supongo que quiere decir "invocar el constructor de una clase") no siempre devuelve una nueva instancia de la clase. Si invoca un constructor de fábrica , puede recuperar una instancia existente . Esta es la razón por la que newse desaconseja: usarlo parece que crea incondicionalmente una nueva instancia cuando es posible que no.
jamesdlin