Respostas:
Há uma postagem no site da dardo e explica muito bem.
Final:
"final" significa atribuição única: uma variável ou campo final deve ter um inicializador. Depois de atribuído um valor, o valor de uma variável final não pode ser alterado. final modifica variáveis .
Const:
"const" tem um significado um pouco mais complexo e sutil no Dart. const modifica valores . Você pode usá-lo ao criar coleções, como const [1, 2, 3], e ao construir objetos (em vez de novos) como const Point (2, 3). Aqui, const significa que todo o estado profundo do objeto pode ser determinado inteiramente em tempo de compilação e que o objeto será congelado e completamente imutável.
Os objetos Const têm algumas propriedades e restrições interessantes:
Eles devem ser criados a partir de dados que podem ser calculados em tempo de compilação. Um objeto const não tem acesso a nada que você precisaria calcular em tempo de execução. 1 + 2 é uma expressão const válida, mas o novo DateTime.now () não é.
Eles são profundamente, transitivamente imutáveis. Se você tiver um campo final contendo uma coleção, essa coleção ainda poderá ser mutável. Se você tem uma coleção const, tudo nela também deve ser const, recursivamente.
Eles são canonizados . É como uma cadeia interna de strings: para qualquer valor const constante, um único objeto const será criado e reutilizado, não importando quantas vezes as expressões const sejam avaliadas.
Const:
se o valor que você possui é calculado em tempo de execução ( new DateTime.now()
por exemplo), não é possível usar uma const para ele. No entanto, se o valor for conhecido em tempo de compilação ( const a = 1;
), você deverá usar const
over final
. Existem outras 2 grandes diferenças entre const
e final
. Em primeiro lugar, se você estiver usando const
, você deve declará-lo como algo que static const
não apenas const
. Em segundo lugar, se você tiver uma const
coleção, tudo dentro dela está incluído const
. Se você tem uma final
coleção, tudo dentro dela não é final
.
Final:
final
deve ser usado novamente const
se você não souber o valor no tempo de compilação e será calculado / obtido no tempo de execução. Se você deseja uma resposta HTTP que não possa ser alterada, se deseja obter algo de um banco de dados ou se deseja ler de um arquivo local, use final
. Qualquer coisa que não seja conhecida no momento da compilação deve final
terminar const
.
Com tudo isso dito, ambos const
e final
não podem ser reatribuídos, mas os campos em um final
objeto, desde que não sejam const
ou final
possam ser reatribuídos (ao contrário const
).
const
e quando final
? Você conhece algum tipo de caso de uso para esse modificador?
O valor deve ser conhecido em tempo de compilação ,
const birthday = "2008/12/26"
Não pode ser alterado após a inicialização.
O valor deve ser conhecido no tempo de execução .
final birthday = getBirthDateFromDB()
Não pode ser alterado após a inicialização.
Respostas consolidadas @Meyi e @ faisal-naseer e Comparando com pouca programação.
palavra-chave const usada para criar uma variável para armazenar um valor constante de tempo de compilação . O valor constante do tempo de compilação é um valor que será constante durante a compilação :-)
Por exemplo, 5
é uma constante de tempo de compilação. Enquanto DateTime.now()
que não é tempo de compilação constante. Porque esse método retornará o horário em que a linha está sendo executada em tempo de execução. Portanto, não podemos atribuir a DateTime.now()
uma const
variável.
const a = 5;
// Uncommenting below statement will cause compile time error.
// Because we can't able to assign a runtime value to a const variable
// const b = DateTime.now();
Deve ser inicializado na mesma linha .
const a = 5;
// Uncommenting below 2 statement will cause compilation error.
// Because const variable must be initialized at the same line.
// const b;
// b = 6;
Todas as declarações mencionadas abaixo são aceitáveis.
// Without type or var
const a = 5;
// With a type
const int b = 5;
// With var
const var c = 6;
A variável const de nível de classe deve ser inicializada como abaixo.
Class A {
static const a = 5;
}
A variável const no nível da instância não é possível .
Class A {
// Uncommenting below statement will give compilation error.
// Because const is not possible to be used with instance level
// variable.
// const a = 5;
}
O outro uso principal const
é usado para tornar o objeto imutável . Para tornar um objeto de classe imutável, precisamos usar a palavra-chave const com o construtor e tornar todos os campos finais, como mencionado abaixo.
Class A {
final a, b;
const A(this.a, this.b);
}
void main () {
// There is no way to change a field of object once it's
// initialized.
const immutableObja = const A(5, 6);
// Uncommenting below statement will give compilation error.
// Because you are trying to reinitialize a const variable
// with other value
// immutableObja = const A(7, 9);
// But the below one is not the same. Because we are mentioning objA
// is a variable of a class A. Not const. So we can able to assign
// another object of class A to objA.
A objA = const A(8, 9);
// Below statement is acceptable.
objA = const A(10, 11);
}
podemos usar a palavra-chave const para uma lista .
const a = const [] - Uma variável a
inicializada como a const
que contém uma lista de const
objetos (ou seja, a lista deve conter apenas objetos constantes e imutáveis em tempo de compilação). Portanto , não podemos atribuir a
a outra lista .
var a = const [] - Uma variável a
inicializada como a var
que contém os const
objetos de uma lista . Assim , podemos atribuir outra lista à variávela
.
Class A {
final a, b;
const A(this.a, this.b);
}
class B {
B(){ // Doing something }
}
void main() {
const constantListOfInt = const [5, 6, 7,
// Uncommenting below statement give compilation error.
// Because we are trying to add a runtime value
// to a constant list
// DateTime.now().millisecondsSinceEpoch
];
const constantListOfConstantObjA = const [
A(5, 6),
A(55, 88),
A(100, 9),
];
// Uncommenting below 2 statements will give compilation error.
// Because we are trying to reinitialize with a new list.
// constantListOfInt = [8, 9, 10];
// constantListOfConstantObjA = const[A(55, 77)];
// But the following lines are little different. Because we are just
// trying to assign a list of constant values to a variable. Which
// is acceptable
var variableWithConstantList = const [5, 6, 7];
variableWithConstantList = const [10, 11, 15];
var variableOfConstantListOfObjA = const [A(5, 8), A(7, 9), A(10, 4)];
variableWithConstantList = const [A(9, 10)];
}
A palavra-chave final também é usada para fazer com que a variável mantenha um valor constante . Uma vez inicializado, não podemos alterar o valor.
final a = 5;
// Uncommenting below statement will give compilation error.
// Because a is declared as final.
// a = 6;
Todas as declarações mencionadas abaixo são aceitáveis.
// Without type or var
final a = 5;
// With a type
final int b = 5;
// With var
final var c = 6;
Consegue atribuir um valor de tempo de execução .
// DateTime.now() will return the time when the line is getting
// executed. Which is a runtime value.
final a = DateTime.now();
var b = 5;
final c = b;
A variável final no nível da classe deve ser inicializada na mesma linha.
Class A {
static final a = 5;
static final b = DateTime.now();
}
A variável final no nível da instância deve ser inicializada na mesma linha ou na inicialização do construtor. O valor será colocado na memória quando o objeto for criado.
Class A {
final a = 5;
}
// Constructor with a parameter.
Class B {
final b;
B(this.b);
}
// Constructor with multiple parameter.
Class C {
final c;
C(this.c, int d) {
// Do something with d
}
}
void main() {
A objA = new A();
B objB = new B(5);
C objC = new C(5, 6);
}
Atribuindo uma lista .
final a = [5, 6, 7, 5.6, A()];
// Uncommenting Below statement will give compilation error.
// Because we are trying to reinitialize the object with another list.
// a = [9.9, 10, B()];
Estendendo a resposta por @Meyi
biggestNumberOndice
somente então, o valor será inicializado e a memória será atribuída).const é internamente final por natureza, mas a principal diferença é que sua constante de tempo de compilação, que é inicializada durante a compilação, mesmo que você não use seu valor, ela será inicializada e ocupará espaço na memória.
A variável das classes pode ser final, mas não constante, e se você quiser uma constante no nível da classe, torne-a estática.
Código:
void main() {
// final demonstration
final biggestNumberOndice = '6';
// biggestNumberOndice = '8'; // Throws an error for reinitialization
// const
const smallestNumberOnDice = 1;
}
class TestClass {
final biggestNumberOndice = '6';
//const smallestNumberOnDice = 1; //Throws an error
//Error . only static fields can be declared as constants.
static const smallestNumberOnDice = 1;
}
Ambos final
e const
evitar uma variável de ser transferido (semelhante à forma como final
funciona em Java ou comoconst
trabalhos em JavaScript).
A diferença tem a ver com a maneira como a memória é alocada. A memória é alocada para uma final
variável em tempo de execução e para uma const
variável em tempo de compilação. O final
modificador deve ser o mais comumente usado, porque muitas variáveis de programa não precisam de memória, pois a lógica do programa não exige que sejam inicializadas. Com umconst
variável, você basicamente diz ao computador: "Ei, preciso de memória para essa variável logo porque sei que vou precisar".
Pensar nelas dessa maneira facilita a compreensão das diferenças em seu uso sintático. Principalmente que uma final
variável pode ser uma variável de instância, mas const
deve ser uma static
variável em uma classe. Isso ocorre porque as variáveis de instância são criadas em tempo de execução e as const
variáveis - por definição - não são. Assim, const
variáveis em uma classe devem serstatic
, o que significa simplesmente que uma única cópia dessa variável existe em uma classe, independentemente de essa classe ser instanciada.
Este vídeo divide-o de maneira bastante simples: https://www.youtube.com/watch?v=9ZZL3iyf4Vk
Este artigo aborda mais profundamente e explica uma diferença semântica muito importante entre os dois, ou seja, final
modifica variáveis e const
modifica valores, que basicamente se resumem a apenas ser capaz de inicializar const
valores deriváveis em tempo de compilação.
https://news.dartlang.org/2012/06/const-static-final-oh-my.html
Se você está vindo C++
em seguida, const
em Dart
é constexpr
em C++
e final
em Dart
é const
no C++
.
O acima se aplica apenas aos tipos primitivos. No entanto, nos Dart
objetos marcados final
são mutáveis em termos de seus membros.
const
quase sempre é usado em C ++ para especificar que um objeto não é mutável por meio de uma referência ou ponteiro específico. final
no Dart não impede que o objeto seja alterado por essa variável.
Quando usar qual palavra-chave?
Um exemplo simples para ambos: Use final: se você não souber qual será o valor no momento da compilação. Por exemplo, quando você pode precisar obter dados de uma API, isso acontece ao executar seu código.
Use const: se você tem certeza de que um valor não será alterado ao executar seu código. Por exemplo, quando você declara uma frase que sempre permanece a mesma.
https://itnext.io/difference-between-const-and-final-in-dart-78c129d0c573
const
: stackoverflow.com/questions/51576209/… e a explicação simples parafinal
é constante (não é possível reatribuir ou atribuir uma vez criada com a palavra-chave final) e você deve inicializá-la uma vez.