Você precisa usar a palavra-chave “nova” no Dart?

90

No meu aplicativo baseado em Dart, acabei de notar que posso omitir a newpalavra - chave e tudo funciona perfeitamente.

Em vez de final widget = new Widget();também posso usar final widget = Widget();.

Isso tem algum efeito no código?

creativecreatorormaybenot
fonte

Respostas:

112

Não, não tem. Com o Dart 2 (clique para ver o anúncio com mais informações), as palavras-chave newe também constse tornaram opcionais .

Isso significa que new Widget()faz exatamente o mesmo que Widget()por conta própria.


A constpalavra-chave pode, no entanto, alterar um valor que não seria a constimplicitamente para a const.
Portanto, você terá que especificar explicitamente constquando necessário.

creativecreatorormaybenot
fonte
6
A equipe Dart teve que se retrair um pouco por enquanto e há algumas situações onde newou constainda são obrigatórios (não me lembro de exemplos ou regras). Eles podem fazer outra tentativa após o Dart 2 para torná-lo opcional em todos os lugares.
Günter Zöchbauer
1
Não há locais onde newé obrigatório. Se você omitir newum programa correto, ele sempre continuará funcionando da mesma maneira. Se você remover constde um programa em funcionamento, na maioria dos casos em que teria que escrever constpara que o programa fosse válido, ele ainda será válido. Sempre que já houver um constcircundando a expressão, você pode omitir o const aninhado.
LRN
20

No Dart 2, se você invocar um construtor como uma função, sem um newou constna frente, é equivalente a usar new. Se você quiser uma invocação const, deve colocá-la constna frente.

Dentro de uma expressão const, você não precisa escrever constnovamente, e em alguns contextos que requerem expressões const (como expressões de switch case e inicializadores de variáveis ​​const), você nem mesmo precisa do const externo.

Então, você nunca precisa escrever new.

A equipe da linguagem Dart deseja permitir expressões onde você pode inserir newou conste ainda ter a invocação correta (ou seja, um construtor const com argumentos constantes) para inserir como padrão em constvez de new, esperançosamente em uma atualização antecipada do Dart 2. Por esse motivo , Eu recomendo escrevê- newlo antes de Object(), ou qualquer outro construtor const onde você precisa que o objeto seja uma nova instância. Esse é um caso muito raro, geralmente você não se preocupa com a identidade do seu objeto imutável (é por isso que inserir consté considerado uma boa ideia).

lrn
fonte
4

A newpalavra-chave tornou-se opcional no Dart 2. A partir de agora, chamar uma classe sempre retornará uma nova instância dessa classe. Conforme minha recomendação, você pode usá-lo ( NÃO OBRIGATÓRIO ) fora de uma definição de Layout, mas omitir dentro de Layouts.

Mais um ponto que eu gostaria de compartilhar com vocês é que se você usar uma palavra new- constchave ao declarar widgets , você também poderá ver o ícone + que pode ser usado para recolher e expandir o código do corpo do widget. Isso é útil quando você deseja recolher / ocultar o código do widget restante no arquivo dart enquanto trabalha em outro código do widget no mesmo arquivo.

Rahul Sharma
fonte
Boa pegada nessa coisa de colapso
MoGa
2
O comportamento de recolhimento seria específico do IDE. Você deve indicar explicitamente a qual (is) se aplica.
Jamesdlin
1
Além disso, "chamar uma classe" (com o qual presumo que você queira dizer "invocar o construtor de uma classe") nem sempre retorna uma nova instância da classe. Se você invocar um construtor de fábrica , poderá obter de volta uma instância existente . É por isso que newé desencorajado: usá-lo parece que cria uma nova instância incondicionalmente, quando talvez não.
Jamesdlin