Antworten:
Es gibt einen Beitrag auf der Website von dart, der ihn ziemlich gut erklärt.
Finale:
"final" bedeutet Einzelzuweisung: Eine endgültige Variable oder ein endgültiges Feld muss einen Initialisierer haben. Sobald ein Wert zugewiesen wurde, kann der Wert einer endgültigen Variablen nicht mehr geändert werden. final ändert Variablen .
Const:
"const" hat eine Bedeutung, die in Dart etwas komplexer und subtiler ist. const ändert Werte . Sie können es verwenden, wenn Sie Sammlungen wie const [1, 2, 3] erstellen und wenn Sie Objekte (anstelle von neuen) wie const Point (2, 3) erstellen. Hier bedeutet const, dass der gesamte tiefe Zustand des Objekts vollständig zur Kompilierungszeit bestimmt werden kann und dass das Objekt eingefroren und vollständig unveränderlich ist.
Const-Objekte haben einige interessante Eigenschaften und Einschränkungen:
Sie müssen aus Daten erstellt werden, die zur Kompilierungszeit berechnet werden können. Ein const-Objekt hat keinen Zugriff auf alles, was Sie zur Laufzeit berechnen müssten. 1 + 2 ist ein gültiger const-Ausdruck, new DateTime.now () jedoch nicht.
Sie sind zutiefst transitiv unveränderlich. Wenn Sie ein letztes Feld haben, das eine Sammlung enthält, kann diese Sammlung weiterhin veränderbar sein. Wenn Sie eine const-Auflistung haben, muss alles darin auch rekursiv const sein.
Sie sind kanonisiert . Dies ähnelt einer internen Zeichenfolge: Für jeden gegebenen const-Wert wird ein einzelnes const-Objekt erstellt und wiederverwendet, unabhängig davon, wie oft die const-Ausdrücke ausgewertet werden.
Const:
Wenn der Wert, den Sie haben, zur Laufzeit berechnet wird ( new DateTime.now()
zum Beispiel), können Sie keine const dafür verwenden. Wenn der Wert jedoch zur Kompilierungszeit bekannt ist ( const a = 1;
), sollten Sie const
over verwenden final
. Es gibt zwei weitere große Unterschiede zwischen const
und final
. Erstens, wenn Sie verwenden const
, müssen Sie es als static const
und nicht nur deklarieren const
. Zweitens, wenn Sie eine const
Sammlung haben, ist alles darin enthalten const
. Wenn Sie eine final
Sammlung haben, ist nicht alles darin final
.
Final: Sollte
final
verwendet werden, const
wenn Sie den Wert zur Kompilierungszeit nicht kennen, und er wird zur Laufzeit berechnet / abgerufen. Wenn Sie eine HTTP-Antwort wünschen, die nicht geändert werden kann, wenn Sie etwas aus einer Datenbank abrufen möchten oder wenn Sie aus einer lokalen Datei lesen möchten, verwenden Sie final
. Alles , was nicht bekannt ist , wird bei der Kompilierung soll final
über const
.
Wenn all dies gesagt ist, können beide const
und final
nicht neu zugewiesen werden, aber Felder in einem final
Objekt können (im Gegensatz zu ) neu zugewiesen werden , solange sie nicht const
oder final
nicht zugewiesen werden const
.
const
und wann final
? Kennen Sie einen Anwendungsfall für diese Modifikatoren?
Der Wert muss zur Kompilierungszeit bekannt sein .
const birthday = "2008/12/26"
Kann nach der Initialisierung nicht geändert werden.
Der Wert muss zur Laufzeit bekannt sein .
final birthday = getBirthDateFromDB()
Kann nach der Initialisierung nicht geändert werden.
Konsolidierte Antworten von @Meyi und @ faisal-naseer und Vergleichen mit wenig Programmierung.
Das Schlüsselwort const wird verwendet, um eine Variable zum Speichern eines Konstantenwerts für die Kompilierungszeit zu erstellen . Der Wert für die Kompilierungszeitkonstante ist ein Wert, der beim Kompilieren konstant bleibt :-)
Zum Beispiel 5
ist eine Kompilierungszeitkonstante. Während DateTime.now()
das nicht Kompilierzeitkonstante ist. Weil diese Methode die Zeit zurückgibt, zu der die Zeile zur Laufzeit ausgeführt wird. Wir können das also nicht DateTime.now()
einer const
Variablen zuordnen .
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();
Sollte in derselben Zeile initialisiert werden .
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;
Alle unten genannten Aussagen sind akzeptabel.
// Without type or var
const a = 5;
// With a type
const int b = 5;
// With var
const var c = 6;
Die Konstantenvariable auf Klassenebene sollte wie folgt initialisiert werden.
Class A {
static const a = 5;
}
Konstante Variable auf Instanzebene ist nicht möglich .
Class A {
// Uncommenting below statement will give compilation error.
// Because const is not possible to be used with instance level
// variable.
// const a = 5;
}
Die andere Hauptverwendung von const
wird verwendet, um das Objekt unveränderlich zu machen . Um ein Klassenobjekt unveränderlich zu machen, müssen wir das Schlüsselwort const mit dem Konstruktor verwenden und alle Felder wie unten erwähnt als endgültig festlegen.
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);
}
Wir können das Schlüsselwort const für eine Liste verwenden .
const a = const [] - Eine a
initialisierteconst
const
Variable, die eine Liste von Objekten enthält (dh die Liste sollte nur Kompilierungszeitkonstanten und unveränderliche Objekte enthalten). So können wir zuordnen nicht in der Lage a
mit einer anderen Liste .
var a = const [] - Eine Variable a
initialisiert , wie var
die eine Liste enthält const
Objekte . So können wir der Variablen eine andere Liste zuweisena
.
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)];
}
Das Schlüsselwort final wird auch verwendet, um die Variable so zu gestalten , dass sie einen konstanten Wert enthält . Nach der Initialisierung können wir den Wert nicht mehr ändern.
final a = 5;
// Uncommenting below statement will give compilation error.
// Because a is declared as final.
// a = 6;
Alle unten genannten Aussagen sind akzeptabel.
// Without type or var
final a = 5;
// With a type
final int b = 5;
// With var
final var c = 6;
Kann einen Laufzeitwert zuweisen .
// 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;
Die endgültige Variable auf Klassenebene muss in derselben Zeile initialisiert werden.
Class A {
static final a = 5;
static final b = DateTime.now();
}
Die endgültige Variable auf Instanzebene muss in derselben Zeile oder in der Konstruktorinitialisierung initialisiert werden. Der Wert wird beim Erstellen des Objekts gespeichert.
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);
}
Zuweisen einer 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()];
Erweiterung der Antwort um @Meyi
biggestNumberOndice
nur den Wert von verwenden, wird der Wert initialisiert und der Speicher zugewiesen).const ist intern endgültig, aber der Hauptunterschied besteht darin, dass seine Kompilierungszeitkonstante, die während der Kompilierung initialisiert wird, auch wenn Sie seinen Wert nicht verwenden, initialisiert wird und Speicherplatz beansprucht.
Variablen aus Klassen können endgültig, aber nicht konstant sein. Wenn Sie eine Konstante auf Klassenebene wünschen, machen Sie sie statisch 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;
}
Beides final
und const
verhindern, dass eine Variable neu zugewiesen wird (ähnlich wie final
in Java oder const
in JavaScript).
Der Unterschied hängt damit zusammen, wie Speicher zugewiesen wird. Der Speicher wird zur final
Laufzeit für eine const
Variable und zur Kompilierungszeit für eine Variable zugewiesen . Der final
Modifikator sollte am häufigsten verwendet werden, da viele Programmvariablen keinen Speicher benötigen, da die Programmlogik nicht verlangt, dass sie initialisiert werden. Mit einer const
Variablen sagen Sie dem Computer im Grunde: "Hey, ich brauche Speicher für diese Variable im Voraus, weil ich weiß, dass ich ihn brauchen werde."
Wenn Sie sie auf diese Weise betrachten, ist es einfacher, Unterschiede in ihrer syntaktischen Verwendung zu verstehen. Hauptsächlich, dass afinal
Variable Instanzvariable sein kann, a const
jedoch eine static
Variable in einer Klasse sein muss. Dies liegt daran, dass Instanzvariablen zur Laufzeit erstellt werden und const
Variablen per Definition nicht. Daher müssen const
Variablen in einer Klasse sein static
, was einfach bedeutet, dass eine einzelne Kopie dieser Variablen in einer Klasse vorhanden ist, unabhängig davon, ob diese Klasse instanziiert ist.
In diesem Video wird es ziemlich einfach aufgeschlüsselt: https://www.youtube.com/watch?v=9ZZL3iyf4Vk
Dieser Artikel geht tiefer und erklärt einen sehr wichtigen semantischen Unterschied zwischen den beiden, dh final
modifiziert Variablen und const
modifiziert Werte, was im Wesentlichen darauf hinausläuft, nur const
Werte initialisieren zu können, die zur Kompilierungszeit ableitbar sind.
https://news.dartlang.org/2012/06/const-static-final-oh-my.html
Wenn Sie kommen C++
dann const
in Dart
ist constexpr
in C++
und final
in Dart
ist const
in C++
.
Das Obige gilt nur für primitive Typen. In Dart
Objekten sind markierte Objekte final
jedoch in Bezug auf ihre Mitglieder veränderbar.
const
In C ++ wird fast immer verwendet, um anzugeben, dass ein Objekt nicht durch eine bestimmte Referenz oder einen bestimmten Zeiger veränderbar ist. final
in Dart verhindert nicht, dass das Objekt durch diese Variable mutiert wird.
Wann soll welches Schlüsselwort verwendet werden?
Ein einfaches Beispiel für beide: Verwenden Sie final: Wenn Sie nicht wissen, welchen Wert es beim Kompilieren hat. Wenn Sie beispielsweise Daten von einer API abrufen müssen, geschieht dies, wenn Sie Ihren Code ausführen.
Verwenden Sie const: Wenn Sie sicher sind, dass ein Wert beim Ausführen Ihres Codes nicht geändert wird. Zum Beispiel, wenn Sie einen Satz deklarieren, der immer gleich bleibt.
https://itnext.io/difference-between-const-and-final-in-dart-78c129d0c573
const
: stackoverflow.com/questions/51576209/… und die einfache Explonation zufinal
ist konstant (kann nicht neu zugewiesen oder zugewiesen werden, sobald sie mit dem endgültigen Schlüsselwort erstellt wurde), und Sie müssen sie einmal initialisieren.