https://www.dartlang.org/guides / language / language-tour # final-and-const
Dans Language Tour of Dart docs, il est dit «Remarque: les variables d'instance peuvent être finales mais pas const. Les variables d'instance finale doivent être initialisées avant que le corps du constructeur ne démarre - à la déclaration de variable, par un paramètre du constructeur ou dans le constructeur liste d'initialiseurs. "
Mais il est possible de créer un objet constant en utilisant un constructeur de constante. Pourquoi n'est-il pas possible de déclarer une variable constante comme variable membre dans Dart?
4 Réponses :
Vous pouvez avoir des constantes dans une classe mais elles ne seront pas classées comme variables d'instance. La clé repose sur la différence entre final et const, vous ne pouvez pas avoir de variables d'instance const car les constantes ne sont pas des variables.
Les constantes à l'intérieur des classes doivent être statiques, vous pouvez donc écrire quelque chose comme:
class MyClass {
static const kMyConstant = 100;
void talk() {
print('My constant is $kMyConstant');
}
}
Ceci est parfaitement valide dans dart.
p>
const signifie la constante de compilation.
Si vous devez créer une instance au moment de l'exécution pour créer la valeur, ce n'est plus une constante de compilation et donc ses membres ne peuvent pas non plus être const .
Les membres statiques n'ont pas besoin d'une instance pour être créés et peuvent donc être constants peu importe si la classe a un constructeur const ou s'il est utilisé avec const ou non.
Mais pourquoi les champs finaux des instances const ne sont pas également assignables à const? Ils sont constants de temps de compilation
L'accès Getter n'est pas valide dans les expressions const. Fields et getter est équivalent à Dart pour l'utilisateur d'une classe. Vous pouvez changer un champ en getter sans casser les utilisateurs de votre classe. Si l'accès au champ est autorisé, l'accès getter doit également l'être. Cela briserait ce concept dans Dart.
Pourquoi l'analyseur est-il alors capable de lire les propriétés d'un objet constant? Parce que si le getter est uniquement à l'exécution, un générateur de code ne devrait pas être capable de savoir ce qu'il contient.
Bonne question, mais je ne sais pas grand-chose sur l'analyseur.
Pourquoi n'est-il pas possible de déclarer une variable constante en tant que membre variable dans Dart?
Définissons d'abord ce que sont les variables de membre ou d'instance. Les variables d'instance sont essentiellement des éléments qui définissent les propriétés d'un objet. Ainsi, un objet d'une classe Car fait comme Car (name: "Mercedeces", price: 500000) aura des valeurs de propriété de membre différentes de celles de Car (name: "Toyota", prix: 10000) .
Maintenant, avoir une variable d'instance comme final signifie essentiellement qu'une fois que vous avez défini un objet Car avec le nom Mercedes , vous ne pouvez absolument pas changer le nom de l'objet au moment de l'exécution. Vous supposez que vous avez besoin d'une Voiture avec le nom BMW , alors créez un nouvel objet. Cela a du sens lorsque vous autorisez les propriétés d'instance comme final .
Maintenant, regardons const . const sont des constantes de temps de compilation. Supposons que vous soyez autorisé à définir la variable d'instance name de Car comme const . Cela signifie essentiellement que, quel que soit le nombre d'instances que vous créez de l'objet Car , tous les noms seront les mêmes et, tout comme les membres final , vous ne pouvez pas le changer. La première partie semble étrange . Toutes les voitures n'auront pas le même nom , ce qui est contradictoire avec la signification de l'instance ou de l'objet d'une classe. Une propriété d'objet peut être immuable, en utilisant final mais n'aura certainement pas les mêmes valeurs. Vous voudriez pouvoir créer des instances de Mercedes parfois et de BMW parfois. Donc, cela n'a aucun sens de créer une propriété d'instance comme const . C'est pourquoi dart n'autorise pas const sans mot-clé statique. Vous avez besoin d'un mot-clé static à côté d'une propriété const à l'intérieur d'une classe car alors seulement il est conforme à la définition des propriétés d'instance.
La partie que je suis confus est qu'en C ++, vous pouvez déclarer une variable const dans une classe, et cette variable peut avoir différentes valeurs dans différentes instances. Les conditions principales pour qu'une variable soit const sont 1. elle doit être initialisée sur la même ligne et ne peut pas être réaffectée 2. elle contient une valeur constante de temps de compilation. Si seules ces conditions doivent être satisfaites, il n'y a aucune raison réelle pour qu'une variable const ait la même valeur dans toutes les instances. Il me semble que la syntaxe de Dart ne distingue pas const de const statique.
Simplement parce que si vous voulez quelque chose de const , cela doit être fait au moment de la compilation, donc non plus:
const : ceci est fait par const -constructor. const . Vous marquez un seul champ const n'a aucun sens.
Par exemple const signifie "un seul" ici: vous pouvez utiliser la classe Car pour créer de nombreuses instances Car , puis vous dites votre roue est const , vous partagez donc une roue entre toutes les Voiture ?
Mais vous pouvez faire en sorte que Car teslaCar = Car.fromModel (type: "Tesla") obtenir le seul modèle à la compilation const Car .