2012-09-14 5 views

Antwort

23

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.

+0

"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. –

+0

@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