Saltar al contenido

¿Cuál es la diferencia entre las palabras clave “const” y “final” en Dart?

Ya no necesitas indagar más por internet ya que llegaste al espacio exacto, tenemos la respuesta que buscas sin liarte.

Solución:

Hay una publicación 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. modifica final variables.


Const:

“const” tiene un significado un poco más complejo y sutil en Dart. const modifica 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 por completo en tiempo de compilación y que el objeto se congelará y será completamente inmutable.

Los objetos constantes tienen un par de propiedades y restricciones interesantes:

Deben crearse a partir de datos que se puedan calcular en el momento de la compilación. Un objeto const no tiene acceso a nada que necesite calcular en tiempo de ejecución. 1 + 2 es una expresión constante válida, pero new DateTime.now () no lo es.

Son profunda y transitivamente inmutables. Si tiene un campo final que contiene una colección, esa colección aún puede ser mutable. Si tiene una colección constante, todo lo que contenga también debe ser constante, de forma recursiva.

Son canonizado. Esto es algo así como string interning: para cualquier valor constante dado, se creará y reutilizará un único objeto constante sin importar cuántas veces se evalúen las expresiones constantes.


¿Entonces, qué significa esto?

Const:

Si el valor que tiene se calcula en tiempo de ejecución (new DateTime.now(), por ejemplo), puedes no use una constante para ello. Sin embargo, si el valor se conoce en el momento de la compilación (const a = 1;), entonces deberías usar const sobre final. Hay otras 2 grandes diferencias entre const y final. En primer lugar, si está utilizando const, tienes que declararlo como static const en lugar de solo const. En segundo lugar, si tiene un const colección, todo lo que hay dentro de eso está en const. Si tienes un final colección, todo lo que hay dentro de eso es nofinal.

Final:
final debe usarse sobre const si no conoce el valor en tiempo de compilación, se calculará / tomará en tiempo de ejecución. Si desea una respuesta HTTP que no se pueda cambiar, si desea obtener algo de una base de datos o si desea leer desde un archivo local, use final. Todo lo que no se conozca en tiempo de compilación debería ser final sobre const.


Con todo eso dicho, ambos const y final no se pueden reasignar, pero los campos en un final objeto, siempre que no sean const o final ellos mismos, se pueden reasignar (a diferencia de const).

Const

El valor debe conocerse en tiempo de compilación, const birthday = "2008/12/25"
No se puede cambiar después de inicializado.


Final

El valor debe conocerse en tiempo de ejecución, final birthday = getBirthDateFromDB()
No se puede cambiar después de inicializado.

Respuestas consolidadas de @Meyi y @ faisal-naseer y Comparación con poca programación.

const:

const palabra clave utilizada para hacer una variable para almacenar un compilar valor constante de tiempo. El valor de la constante de tiempo de compilación es un valor que será constante durante la compilación 🙂

Por ejemplo 5 es una constante de tiempo de compilación. Tiempo DateTime.now() que no es constante de tiempo de compilación. Debido a que este método devolverá el tiempo en el que se ejecuta la línea en tiempo de ejecución. Entonces no podemos asignar el DateTime.now() a un const variable.

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();

Debiera ser inicializado 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;

Variable constante de nivel de clase debe inicializarse como se muestra a continuación.

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 usa para hacer el objeto inmutable. Para hacer que un objeto de clase sea inmutable, necesitamos usa la palabra clave const con constructor y hacer todos los campos como final 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);

nosotros podemos usar const palabra clave a una lista.

const a = const [] – Una variable ainicializado como const que contiene una lista de const objetos(es decir, la lista debe contener solo objetos inmutables y constantes de tiempo de compilación). Entonces no podemos asignar a con otra lista.

var a = const [] – Una variable ainicializado como var que contiene una lista const objetos. 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 usa para hacer que la variable mantener 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 ser capaz de 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;

Variable final a nivel de clase debe inicializarse en la misma línea.

Class A 
    static final a = 5;
    static final b = DateTime.now();

Variable final a nivel de instancia debe inicializarse en la misma línea o en la inicialización del constructor. El valor se guardará en la memoria cuando se cree 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);

Asignar 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()];

Aquí puedes ver las comentarios y valoraciones de los usuarios

Más adelante puedes encontrar las interpretaciones de otros creadores, tú asimismo tienes el poder insertar el tuyo si lo deseas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *