Dart hat ein Konzept von final
. Die meisten dynamischen Sprachen haben dieses Konzept nicht.Was macht der letzte Modifikator in Dart?
Was ist endgültig und wofür verwende ich es?
Dart hat ein Konzept von final
. Die meisten dynamischen Sprachen haben dieses Konzept nicht.Was macht der letzte Modifikator in Dart?
Was ist endgültig und wofür verwende ich es?
final
Variablen können einen beliebigen Wert enthalten, aber einmal zugewiesen, kann eine letzte Variable keinem anderen Wert zugewiesen werden.
Zum Beispiel:
main() {
final msg = 'hello';
msg = 'not allowed'; // **ERROR**, program won't compile
}
final
kann auch zum Beispiel Variablen in einem Objekt verwendet werden. Ein letztes Feld einer Klasse muss festgelegt werden, bevor der Konstruktorhauptteil ausgeführt wird. Ein letztes Feld wird nicht einen impliziten Setter erstellt haben, da Sie einen neuen Wert für eine endgültige Variable nicht festlegen können.
class Point {
final num x, y;
Point(this.x, this.y);
}
main() {
var p = new Point(1, 1);
print(p.x); // 1
p.x = 2; // WARNING, no such method
}
Es ist wichtig zu erkennen, dass final
die Variable beeinflusst, aber nicht das Objekt gerichtet durch die Variable an. Das heißt, final
macht die Variable Objekt unveränderlich.
Zum Beispiel:
class Address {
String city;
String state;
Address(this.city, this.state);
}
main() {
final address = new Address("anytown", "hi");
address.city = 'waikiki';
print(address.city); // waikiki
}
Im obigen Beispiel wird die address
Variablen als final markiert, so wird es immer nach dem Objekt durch den Konstruktor new Address("anytown", "hi")
instanziiert. Das Objekt selbst hat jedoch einen veränderbaren Zustand, daher ist es durchaus möglich, die Stadt zu ändern. Das einzige, was durch final
verhindert wird, ist die Neuzuweisung der Variablen address
.
"Ein letztes Feld einer Klasse muss festgelegt werden, bevor der Konstruktorkörper ausgeführt wird." - Das war der Teil, der mich am meisten umgeworfen hatte. Obwohl ich die letzte Variable im Konstruktor gesetzt habe, ist es mir nicht einmal aufgefallen, dass das der Grund war, warum ich den Fehler bekommen habe. –
@KevinSheehan Ich wurde abgeworfen, indem ich das letzte Feld vor dem Konstruktor setzte. Für diejenigen, die dies auf der Konstruktor-Ebene tun wollten, wenn der Zustand eine endgültige Variable wäre, könnte dies wie folgt eingestellt werden: Adresse (this.city): state = "Hawaii"; – djm