Final e Const no Dart / Flutter
Semelhanças
Caso a intenção seja definir uma variável que não mude o seu valor utilizamos duas palavras reservadas final
e const
antes do tipo da variável. Em resumo as duas são constantes e logicamente, após a sua inicialização, não podemos reatribuir nenhum valor a elas.
final String linguagem = "Dart";
linguagem = "Java"; // Erro: Can't assign to the final variable 'linguagem';
const double altura = 1.78;
altura = 1.75; // Erro: Can't assign to the const variable 'altura';
Diferenças
Enquanto final
é uma constante em tempo de execução, const
é uma constante de tempo de compilação.
Isso basicamente quer dizer que final
não precisa conhecer o seu valor enquanto o compilador do Dart transforma o algoritmo em código de máquina. Mas const
precisa, pois um valor constante para o Dart é aquele conhecido em tempo de compilação.
void main() {
final String value = language();
const String favorite = language(); // Erro: Const variables must be initialized with a constant value
print(value);
print(favorite);
}
String language() => "Dart";
O valor recebido pela variável declarada como final
pode mudar em tempo de execução, mas não a sua atribuição. Por exemplo, o valor retornado por uma função externa ou atributos de um objeto podem mudar. Mas não podemos reatribuir um novo objeto do mesmo tipo ou alterar o conteúdo direto na variável pelo mesmo tipo retornado pela função.
void main() {
final person = Person('Albert', 34);
print(person.age); // 34
person.age = 35;
print(person.age); // 35
...
final welcome = message();
welcome = "Welcome to Flutter"; // Erro: The final variable 'welcome' can only be set once
}
class Person {
String name;
int age;
Person(this.name, this.age);
}
...
String message() => 'Welcome to the amazing world of Dart';
Um outro exemplo disso são as listas. Onde vemos mais claramente que variáveis do tipo final
se preocupam com a reatribuição mas não com os valores da lista.
final linguagens = ['Dart', 'Flutter'];
print(linguagens); // [Dart, Flutter]
linguagens.add('JavaScript');
print(linguagens); // [Dart, Flutter, JavaScript]
linguagens = ["outra lista"]; // Erro: Can't assign to the final variable 'linguagens'