340 votes

Quelle est la différence entre les mots-clés "const" et "final" dans Dart ?

Quelle est la différence entre const et final mot-clé en Dart ?

1 votes

Voici quelques détails sur const : stackoverflow.com/questions/51576209/ et l'explication simple à final est constant (il ne peut pas être réaffecté ou assigné une fois créé avec le mot clé final) et vous devez l'initialiser une fois.

491voto

meyi Points 1862

Il y a un article sur le site de Dart qui l'explique assez bien.

Finale :

"final" signifie à affectation unique : une variable ou un champ final doit ont un initialisateur. Une fois qu'une valeur lui est attribuée, la valeur d'une variable finale ne peut pas être modifiée. final modifie variables .


Const :

Le terme "const" a une signification un peu plus complexe et subtile dans Dart. const modifie valeurs . Vous pouvez l'utiliser pour créer des collections, comme const [1, 2, 3], et pour construire des objets (au lieu de new) comme const Point(2, 3). Ici, const signifie que l'état profond de l'objet peut être entièrement déterminé au moment de la compilation et que l'objet sera gelé et complètement immuable.

Les objets Const ont quelques propriétés et restrictions intéressantes :

Ils doivent être créés à partir de données qui peuvent être calculées au moment de la compilation. Un objet const n'a pas accès à ce que vous auriez besoin de calculer au moment de l'exécution. 1 + 2 est une expression const valide, mais new DateTime.now() ne l'est pas.

Ils sont profondément, transitivement immuables. Si vous avez un champ final contenant une collection, cette collection peut toujours être mutable. Si vous avez une collection const, tout ce qu'elle contient doit également être const, de manière récursive.

Ils sont canonisé . C'est un peu comme l'internage de chaînes de caractères : pour une valeur const donnée, un seul objet const sera créé et réutilisé, quel que soit le nombre de fois où l'expression ou les expressions const sont évaluées.


Alors, qu'est-ce que cela signifie ?

Const :
Si la valeur que vous avez est calculée au moment de l'exécution ( new DateTime.now() par exemple), vous pouvez pas utiliser un const pour cela. Cependant, si la valeur est connue au moment de la compilation ( const a = 1; ), vous devez alors utiliser const sur final . Il existe deux autres grandes différences entre const et final . Tout d'abord, si vous utilisez const vous devez le déclarer comme static const plutôt que juste const . Deuxièmement, si vous avez un const tout ce qui est à l'intérieur de cette collection est dans const . Si vous avez un final tout ce qui est à l'intérieur de cette collection est pas final .

Finale :
final devrait être utilisé plutôt que const si vous ne connaissez pas la valeur au moment de la compilation, et elle sera calculée/grignotée au moment de l'exécution. Si vous voulez une réponse HTTP qui ne peut pas être modifiée, si vous voulez obtenir quelque chose à partir d'une base de données, ou si vous voulez lire à partir d'un fichier local, utilisez final . Tout ce qui n'est pas connu au moment de la compilation doit être final sur const .


Tout cela étant dit, les deux const et final ne peuvent pas être réaffectés, mais les champs d'un final tant qu'ils ne sont pas const ou final eux-mêmes, peuvent être réaffectés (contrairement aux const ).

22 votes

Le mot-clé const est utilisé pour représenter une constante de compilation. Les variables déclarées à l'aide du mot-clé const sont implicitement finales.

4 votes

@CopsOnRoad vous pouvez regarder cette vidéo. Dart Const vs Final

3 votes

Cette dernière phrase résume vraiment bien la situation. Merci pour ça.

208voto

Haroun Hajem Points 594

Const.

La valeur doit être connue à temps de compilation , const birthday = "2008/12/25"
Ne peut pas être modifié après avoir été initialisé.


Final

La valeur doit être connue à temps d'exécution , final birthday = getBirthDateFromDB()
Ne peut pas être modifié après avoir été initialisé.

3 votes

Court et clair. Meilleure réponse avec un exemple épique. Merci.

85voto

Mahendran Sakkarai Points 5702

Consolidation des réponses de @Meyi et @faisal-naseer et comparaison avec une petite programmation.

const :

Le mot-clé const est utilisé pour créer une variable permettant de stocker un valeur constante au moment de la compilation . Une valeur constante à la compilation est une valeur qui sera constante pendant la compilation :-)

Par exemple 5 est une constante de temps de compilation. Alors que DateTime.now() qui n'est pas constant au moment de la compilation. Parce que cette méthode renvoie le le moment où la ligne est exécutée au moment de l'exécution. Nous ne pouvons donc pas affecter le DateTime.now() à 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();

Devrait être initialisés à la même ligne .

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;

Toutes les déclarations mentionnées ci-dessous sont acceptables.

// Without type or var
const a = 5;
// With a type
const int b = 5;
// With var
const var c = 6;

Variable constante de niveau classe doit être initialisé comme ci-dessous.

Class A {
    static const a = 5;
}

La variable const au niveau de l'instance n'est pas possible .

Class A {
    // Uncommenting below statement will give compilation error.
    // Because const is not possible to be used with instance level 
    // variable.
    // const a = 5;
}

L'autre utilisation majeure de const est utilisé pour rendre le objet immuable . Pour rendre un objet de classe immuable, nous devons utiliser le mot clé const avec le constructeur et faire tous les champs comme finaux comme indiqué ci-dessous.

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

nous pouvons utiliser mot clé const à une liste .

const a = const [] - Une variable A a initialisé comme const qui contient une liste de const objets (c'est-à-dire que la liste ne doit contenir que des objets constants et immuables au moment de la compilation). Ainsi, nous ne sommes pas en mesure d'assigner a avec une autre liste .

var a = const [] - Une variable a initialisé comme var qui contient une liste const objets . Donc nous pouvons assigner une autre liste à 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)];
}

finale :

Le mot clé final est également utilisé pour rendre la variable à maintenir une valeur constante . Une fois initialisé, nous ne pouvons pas changer la valeur.

final a = 5;
// Uncommenting below statement will give compilation error.
// Because a is declared as final.
// a = 6;

Toutes les déclarations mentionnées ci-dessous sont acceptables.

// Without type or var
final a = 5;
// With a type
final int b = 5;
// With var
final var c = 6;

Peut capable de attribuer une valeur d'exécution .

// 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 finale de niveau classe doivent être initialisés dans la même ligne.

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

Variable finale au niveau de l'instance doivent être initialisés dans la même ligne ou dans l'initialisation du constructeur. La valeur sera mise en mémoire lors de la création de l'objet.

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

Attribution de une liste .

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

0 votes

C'est de loin la meilleure réponse ! Elle démontre également que la collection const est définie comme un littéral, ce qui est un cas important que personne n'a couvert.

0 votes

const immutableObja = const A(5, 6); peut également s'écrire comme suit const immutableObja = A(5, 6); parce que const A(5,6) plutôt que new A(5,6) sera choisi par le compilateur Dart intelligent.

1 votes

En fait, final var c = 6; n'est pas autorisé. Les membres déclarés ne peuvent pas être déclarés à la fois final y var .

27voto

Faisal Naseer Points 1498

Extension de la réponse de @Meyi

  • variable finale ne peut être définie qu'une seule fois et elle est initialisée lors de (par exemple, dans la section de code ci-dessous, si vous utilisez la valeur de biggestNumberOndice seulement alors la valeur sera initialisée et la mémoire sera assignée).

  • const est de nature finale en interne mais la principale différence est que c'est une constante de compilation qui est initialisée lors de la compilation. même si vous n'utilisez pas sa valeur, elle sera initialisée et occupera de l'espace place en mémoire.

  • Les variables des classes peuvent être finales mais pas constantes. constante au niveau de la classe, il faut la rendre static const.

Code :

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;
}

2 votes

Je pense qu'une meilleure façon de poser la question est de savoir quand préférer l'initialisation en cours d'exécution à l'initialisation en cours de compilation.....

0 votes

Et pour cela vous pouvez consulter la réponse de @Meyi et aussi visiter le lien de l'article de son post, il est merveilleux :)

6voto

Kirk Richardson Points 21

Les deux sites final et const empêcher une variable d'être réaffectée (de manière similaire à la manière dont les final fonctionne en Java ou comment const fonctionne en JavaScript).

La différence est liée à la manière dont la mémoire est allouée. La mémoire est allouée pour un final au moment de l'exécution, et pour une variable const au moment de la compilation. Le site final devrait être le plus couramment utilisé, car de nombreuses variables de programme n'ont pas besoin de mémoire puisque la logique du programme ne demande pas leur initialisation. Avec un modificateur const variable, vous dites essentiellement à l'ordinateur : "Hé, j'ai besoin de mémoire pour cette variable dès le départ parce que je sais que je vais en avoir besoin".

En les considérant de cette manière, il est plus facile de comprendre les différences dans leur utilisation syntaxique. Principalement qu'un final peut être une variable d'instance, mais une const doit être un static sur une classe. En effet, les variables d'instance sont créées au moment de l'exécution, et const les variables, par définition, ne le sont pas. Ainsi, const Les variables d'une classe doivent être static ce qui signifie simplement qu'une seule copie de cette variable existe sur une classe, que cette classe soit instanciée ou non.

Cette vidéo explique les choses assez simplement : https://www.youtube.com/watch?v=9ZZL3iyf4Vk

Cet article va plus en profondeur et explique une différence sémantique très importante entre les deux, à savoir final modifie les variables et const modifie les valeurs, ce qui revient essentiellement à ne pouvoir qu'initialiser const qui sont dérivables au moment de la compilation.

https://news.dartlang.org/2012/06/const-static-final-oh-my.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X