web-dev-qa-db-fra.com

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

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

30
Sunny

J'ai trouvé ce post sur le site Web de Dart et il l'explique assez bien.

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

Final:

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

Const:

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

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

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

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

Ils sont canonicalized. C'est un peu comme une chaîne interning: pour toute valeur const donnée, un seul objet const sera créé et réutilisé quel que soit le nombre de fois que les expressions const sont évaluées.

35
Meyi

Prolonger la réponse de @Meyi

  • la variable finale ne peut être définie qu'une seule fois et est initialisée lors de l'accès à .__ (par exemple, à partir de la section de code ci-dessous si vous utilisez la valeur biggestNumberOndice uniquement, la valeur sera initialisée et la mémoire attribuée.).
  • const est de nature finale en interne mais la principale différence est que sa constante de temps de compilation initialisée lors de la compilation même si vous n'utilisez pas sa valeur, elle sera initialisée et prendraspace en mémoire.

  • La variable des classes peut être finale mais pas constante et si vous voulez une constante Au niveau de la classe, rendez-la statique.

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;
}
10
Faisal Naseer

Réponses @Meyi et @ faisal-naseer consolidées et comparaison avec peu de programmation.

const:

mot-clé const utilisé pour créer une variable afin de stocker une valeur constante de compilation. La valeur constante de la compilation est une valeur qui sera constante lors de la compilation :-)

Par exemple, 5 est une constante de temps de compilation. While DateTime.now() qui n’est pas une constante de temps de compilation. Parce que cette méthode renverra le heure à laquelle la ligne sera exécutée} au moment de l'exécution. Nous ne pouvons donc pas affecter la DateTime.now() à une 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();

Devrait être initialisé à 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 devrait être initialisé comme ci-dessous.

Class A {
    static const a = 5;
}

La variable de niveau 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ée pour rendre le objet immuable. Pour rendre un objet de classe immuable, nous devons utiliser le mot-clé const avec constructeur et faire tous les champs finaux comme mentionné 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 dans une liste

const a = const [] - Une variable ainitialisée sous la forme const qui contient une liste d'objets const (c'est-à-dire. La liste ne doit contenir que des objets constants et immuables à la compilation). Donc, nous ne pouvons pas affecter a avec une autre liste.

var a = const [] - Une variable ainitialisée sous la forme var qui contient une liste d'objets const. Donc, nous pouvons attribuer 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)];
}

final:

le mot-clé final est également utilisé pour rendre la variable égale à conserver 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;

Pouvons pouvoir assigner 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 au niveau de la classe} doit être initialisé dans la même ligne.

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

Variable finale de niveau d'instance doit être initialisé sur 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);
}

Assigner 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()];
8
Mahendran Sakkarai

Const

La valeur doit être connue à au moment de la compilation , const birth = "2008/12/26". Ne peut pas être changé après initialisé


Final

La valeur doit être connue à à l'exécution , final birth = getBirthFromDB(). Ne peut pas être changé après initialisé

4
Haroun Hajem

Si vous venez de C++ alors const dans Dart est constexpr dans C++ et final dans Dart est const dans C++.

Ce qui précède s’applique uniquement aux types primitifs . Cependant, dans Dart, les objets marqués final peuvent être modifiés en fonction de leurs membres.

0
Moshe Rabaev