Fala João! Parabéns pelo interesse de aprender mais fundo, isso é ótimo!
Reposta curta: Sim. Exatamente;
Resposta completa:
É interessante perceber que final
, const
e static
no Dart representam coisas bem diferentes, mas que podem confundir bastante, vou falar das três para deixar claro:
Static
Vamos usar Static
durante a construção de uma classe para definir membros (atributos, métodos, etc) que estão disponíveis apenas nas próprias classes (e não nas suas instâncias).
O static
modifica membros em uma classe!
Exemplo:
class MyClass {
static double ano = 2022;
double mes = 01;
}
class OtherClass {
void canIAccessAno() {
MyClass instancia = MyClass();
instancia.mes = 2; // Consigo acessar
instancia.ano // Erro! Não consigo acessar
}
}
Final
Já o final
significa atribuição única para variáveis: uma variável ou campo final deve ser inicializada. Uma vez atribuído um valor, o valor de uma variável final não pode ser alterado.
O final
modifica variáveis!
Exemplo:
class MyClass {
final String name = "Ricarth";
final String lastName; // Erro! Variáveis finais devem ser inicializadas!
void changeName(){
name = "Lilie"; // Erro! Variáveis finais não podem ser alteradas!
}
}
Const
Essa é mais complicada e sutil. E depois da atualização do Flutter onde o Linter foi padronizado, aparece warning pra todo canto pedindo para você colocar consts! Se quiser saber mais sobre isso, assiste esse Alura+!
As consts
modificam valores!
Exemplo:
class MyClass {
String? name; // Sem final ou static
void changeName(String novoNome){
name = novoNome;
} // Até aqui tudo bem
void run(){
const String constName = "Ricarth";
changeName(constName); // Funciona!
constName = "Lilie"; // Erro! O valor "Ricarth" não pode ser mudado!
}
}
Curiosidade: Final x Const
O final
não transmite sua imutabilidade, o const
sim! Imagine o caso de uma lista, como o modificador final
os elementos da lista ainda podem ser mudados por acesso direto, já com o const
não.
class MyClass {
final List<String> names = ["Ricarth", "Lima"];
static const List<String> constNames = ["Ricarth", "Lima"];
void run() {
names[0] = "Lilie"; // Funciona!
constNames[0] = "Lilie"; // Erro em tempo de execução!
}
}
Ocorreu uma exceção.
UnsupportedError (Unsupported operation: Cannot modify an unmodifiable list)
Conclusões
E para quê usar isso tudo? Basicamente por duas razões:
Legibilidade
É extremamente útil se comunicar com outros programadores e programadoras que vão usar seu código no futuro.
Eficiência
Indicando membros, variáveis ou valores imutáveis você permite o Flutter fazer otimizações que vão aumentar a eficiência da sua aplicação.
No mais, é isso, espero que tenha ajudado! Deixo como referências/leituras complementares esses dois links: