2012-09-14 87 views

Respuesta

23

final variables pueden contener cualquier valor, pero una vez asignadas, una variable final no puede reasignarse a ningún otro valor.

Por ejemplo:

main() { 
    final msg = 'hello'; 
    msg = 'not allowed'; // **ERROR**, program won't compile 
} 

final también se puede utilizar para las variables de instancia en un objeto. Se debe establecer un campo final de una clase antes de ejecutar el cuerpo del constructor. Un campo final será no tiene un setter implícito creado para él, porque no puede establecer un nuevo valor en una variable final.

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 importante darse cuenta de que final afecta a la variable, pero no el objeto apuntado por la variable. Es decir, final no hace inmutable el objeto de la variable.

Por ejemplo:

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 
} 

En el ejemplo anterior, la variable address se marca como final, por lo que siempre apuntará al objeto instanciado por el new Address("anytown", "hi") constructor. Sin embargo, el objeto en sí tiene un estado que es mutable, por lo que es perfectamente válido para cambiar la ciudad. Lo único que evitó final es la reasignación de la variable address.

+0

"Se debe establecer un campo final de una clase antes de ejecutar el cuerpo del constructor". - Esta fue la parte que me había estado tirando más. Aunque estaba configurando la variable final en el constructor, ni siquiera se me ocurrió que esa era la razón por la que recibía el error. –

+0

@KevinSheehan Fui expulsado estableciendo el campo final antes que el constructor también. Para aquellos que buscan hacer esto en el nivel de constructor, si el estado era una variable final, se podría establecer así: Dirección (this.city): state = "Hawaii"; – djm