significa - ¿Cuál es la diferencia entre la palabra clave '''' const '''' y '''' final '''' en Dart?
readonly c# (5)
¿Cuál es la diferencia entre
const
y
final
palabra clave
final
en Dart?
Const
El valor debe ser conocido en tiempo de compilación ,
const birth = "2008/12/26"
. No se puede cambiar después de inicializar
Final
El valor debe ser conocido en tiempo de ejecución ,
final birth = getBirthFromDB()
. No se puede cambiar después de inicializar
Extendiendo la respuesta por @Meyi
-
la variable final solo se puede configurar una vez y se inicializa cuando se accede a ella (por ejemplo, en la sección de código a continuación, si usa el valor de
biggestNumberOndice
solamente, el valor se inicializará y la memoria se asignará). -
const es de naturaleza final interna, pero la principal diferencia es que su constante de tiempo de compilación que se inicializa durante la compilación, incluso si no usa su valor, se inicializará y ocupará espacio en la memoria.
-
La variable de las clases puede ser final pero no constante y si desea una constante a nivel de clase, haga que sea constante.
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;
}
Respuestas consolidadas de @Meyi y @ faisal-naseer y comparación con poca programación.
const
La palabra clave const se usa para hacer una variable para almacenar un valor constante de tiempo de compilación . El valor de constante de tiempo de compilación es un valor que será constante al compilar :-)
Por ejemplo
5
es una constante de tiempo de compilación.
Mientras que
DateTime.now()
no es una constante de tiempo de compilación.
Debido a que este método devolverá el
tiempo en que la línea se ejecuta
en tiempo de ejecución.
Así que no podemos asignar el
DateTime.now()
a una variable
const
.
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();
Se debe inicializar en la misma línea .
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 las declaraciones mencionadas a continuación son aceptables.
// Without type or var
const a = 5;
// With a type
const int b = 5;
// With var
const var c = 6;
La variable constante de nivel de clase debe inicializarse como se muestra abajo.
Class A {
static const a = 5;
}
La variable const de nivel de instancia no es posible .
Class A {
// Uncommenting below statement will give compilation error.
// Because const is not possible to be used with instance level
// variable.
// const a = 5;
}
El otro uso importante de
const
se utiliza para hacer el
objeto inmutable
.
Para hacer que un objeto de clase sea inmutable, necesitamos
usar la palabra clave const con el constructor
y hacer que
todos los campos sean finales
como se menciona a continuación.
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 la palabra clave const en una lista .
const a = const [] - Una variable
a
inicializada como
const
que contiene una lista de objetos
const
(es decir, La lista debe contener solo objetos de constante de tiempo de compilación e inmutables).
Así
que no podemos asignar
a
con otra lista
.
var a = const [] - Una variable
a
inicializada como
var
que contiene una lista de objetos
const
.
Entonces
podemos asignar otra lista a la variable
a
.
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)];
}
final:
La palabra clave final también se utiliza para hacer que la variable mantenga un valor constante . Una vez inicializado no podemos cambiar el valor.
final a = 5;
// Uncommenting below statement will give compilation error.
// Because a is declared as final.
// a = 6;
Todas las declaraciones mencionadas a continuación son aceptables.
// Without type or var
final a = 5;
// With a type
final int b = 5;
// With var
final var c = 6;
Puede asignar un valor de tiempo de ejecución .
// 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;
La variable final de nivel de clase debe inicializarse en la misma línea.
Class A {
static final a = 5;
static final b = DateTime.now();
}
La variable final de nivel de instancia debe inicializarse en la misma línea o en la inicialización del constructor. El valor se pondrá en la memoria cuando se crea el objeto.
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);
}
Asignando una 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()];
Si viene de
C++
,
const
en
Dart
es
constexpr
en
C++
y
final
en
Dart
es
const
en
C++
.
Lo anterior se aplica sólo a los tipos primitivos.
Sin embargo, en
Dart
objetos marcados como
final
son mutables en términos de sus miembros.
Hay un post en el sitio web de dart y lo explica bastante bien.
Final:
"final" significa asignación única: una variable o campo final debe tener un inicializador. Una vez asignado un valor, el valor de una variable final no se puede cambiar. Final modifica las variables .
Const
"const" tiene un significado que es un poco más complejo y sutil en Dart. const modifica los valores . Puede usarlo al crear colecciones, como const [1, 2, 3], y al construir objetos (en lugar de nuevos) como const Point (2, 3). Aquí, const significa que todo el estado profundo del objeto se puede determinar completamente en el momento de la compilación y que el objeto se congelará y será completamente inmutable.
Los objetos const tienen un par de propiedades y restricciones interesantes:
Deben crearse a partir de datos que se pueden calcular en tiempo de compilación. Un objeto const no tiene acceso a nada de lo que necesitaría calcular en tiempo de ejecución. 1 + 2 es una expresión de const válida, pero el nuevo DateTime.now () no lo es.
Son profundamente, transitoriamente inmutables. Si tiene un campo final que contiene una colección, esa colección aún puede ser mutable. Si tiene una colección de const, todo lo que contiene debe ser const, recursivamente.
Están canonicalizados . Esto es algo así como una cadena interna: para cualquier valor constante de const, un único objeto const se creará y reutilizará sin importar cuántas veces se evalúen las expresiones const.
¿Entonces, qué significa esto?
Const
Si el valor es el valor que tiene se calcula en tiempo de ejecución (por ejemplo, el
new DateTime.now()
), no puede usar una constante para ello.
Sin embargo, si el valor se conoce en tiempo de compilación (
const a = 1;
), debe usar
const
sobre
final
.
Hay otras 2 grandes diferencias entre
const
y
final
.
En primer lugar, si está utilizando
const
, debe declararlo como
static const
lugar de
const
.
En segundo lugar, si tienes una colección de
const
, todo dentro de eso está en
const
.
Si tienes una colección
final
, todo lo que contiene
no
es
final
.
Final:
final
debe utilizarse sobre
const
si no conoce el valor en el momento de la compilación, y se calculará / capturará en tiempo de ejecución.
Si desea una respuesta HTTP que no se puede cambiar, si desea obtener algo de una base de datos o si desea leer un archivo local, use
final
.
Cualquier cosa que no se sepa en el momento de la compilación debe ser
final
sobre
const
.
Con todo lo que se dice, tanto la
const
como la
final
no se pueden reasignar, pero los campos en un objeto
final
, siempre que no sean
const
o
final
, se pueden reasignar (a diferencia de la
const
).