2012-09-14 13 views

cevap

23

final değişkenler herhangi bir değer içerebilir, ancak bir kez atadıktan sonra, bir son değişken başka bir değere yeniden atanamaz. Örneğin

:

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

final de bir nesnedeki örnek değişkenleri için kullanılabilir. Kurucunun gövdesi çalıştırılmadan önce bir sınıfın son alanı ayarlanmalıdır. Son bir alan için oluşturulmuş bir örtük ayarlayıcıya sahip olacaktır, çünkü son değişkende yeni bir değer ayarlayamazsınız.

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 
} 

O final değişkeni nasıl etkilediğini bilmek önemlidir, ancak nesne değişkeni tarafından işaret. Yani, final değişkenin nesnesini değişmez yapmaz. Örneğin

: Yukarıdaki örnekte

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 
} 

, address değişken son olarak işaretlenmiş, bu yüzden her zaman new Address("anytown", "hi") yapıcısı tarafından örneği nesneye işaret eder. Bununla birlikte, nesnenin kendisi değişebilir olan bir duruma sahiptir, bu yüzden şehri değiştirmek için mükemmeldir. final tarafından önlenen tek şey, address değişkenini yeniden atamadır.

+0

"Kursör gövdesi çalıştırılmadan önce bir sınıfın son alanı ayarlanmalıdır." - Bu beni en çok üzen kısımdı. Son değişkeni yapıcıya koymuş olmama rağmen, hataya ulaşmamın sebebi bende bile gerçekleşmedi. –

+0

@KevinSheehan Kurucudan önce son alanı ayarlayarak atıldım. Yapıcı düzeyinde bunu yapmak isteyenler için, eğer devlet son bir değişken olsaydı, şöyle ifade edilebilirdi: Adres (this.city): state = "Hawaii"; – djm