¿Cuál es la diferencia entre `var`, `final` y `const` en Dart?
Ver respuesta — intenta responderla en voz alta primero
var declara una variable que puede reasignarse. final declara una variable que se asigna una sola vez en tiempo de ejecución. const declara una constante de tiempo de compilación: su valor tiene que conocerse antes de correr el programa. La recomendación es usar final por defecto y const cuando el valor es fijo desde que compilas.
var: le dice a Dart "infiere el tipo por mí". El valor se puede reasignar tantas veces como quieras.final: la variable se asigna una vez y ya no se puede reasignar. El valor puede calcularse en tiempo de ejecución (por ejemplo, la hora actual o algo que venga de una función).const: es una constante de tiempo de compilación. El valor debe ser conocido antes de ejecutar el programa, así que no puede depender de nada que se calcule en runtime.
La diferencia clave entre final y const: final se resuelve cuando corre el programa; const se resuelve cuando compila. Un objeto const además queda "congelado" (es profundamente inmutable) y Dart lo reutiliza en memoria (canonicalización).
Regla práctica: usa final por defecto. Si el valor es literalmente fijo y conocido al compilar, súbelo a const.
void main() {
var contador = 0;
contador = 1; // OK: var se puede reasignar
final nombre = "Mike";
// nombre = "Otro"; // Error: no se puede reasignar una final
final ahora = DateTime.now(); // OK: se calcula en runtime
print(ahora);
const pi = 3.1416; // valor conocido al compilar
// const invalido = DateTime.now(); // Error: DateTime.now() es runtime
// const congela el contenido (inmutable de verdad)
const lista = [1, 2, 3];
// lista.add(4); // Error en tiempo de ejecución: la lista es inmutable
print(lista);
}
Creer que final congela el contenido de un objeto. No es así: final solo evita reasignar la variable. Una List declarada con final sí puede mutar su contenido (.add(), .remove()). Para que el contenido sea inmutable necesitas const.
final numeros = [1, 2, 3];
numeros.add(4); // OK: final permite mutar el contenido
print(numeros); // [1, 2, 3, 4]
"
varpermite reasignar.finalse asigna una sola vez pero su valor puede calcularse en tiempo de ejecución.constes una constante de tiempo de compilación: el valor tiene que conocerse antes de correr el programa, y además congela el objeto para que sea inmutable. Yo usofinalpor defecto yconstcuando el valor es fijo desde que compilo, como en los constructoresconstde Flutter, que ayudan al rendimiento."
¿Cuál de estas líneas da error y por qué?
final a = DateTime.now();
const b = DateTime.now();
Ver respuesta
La línea de const b da error. DateTime.now() se calcula en tiempo de ejecución, así que su valor no se conoce al compilar y no puede ser const. final a sí es válida porque final acepta valores calculados en runtime.