2012-09-14 42 views

Trả lời

23

final biến có thể chứa bất kỳ giá trị nào, nhưng khi được chỉ định, biến cuối cùng không thể được gán lại cho bất kỳ giá trị nào khác.

Ví dụ:

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

final cũng có thể được sử dụng cho các biến Ví dụ trong một đối tượng. Một trường cuối cùng của một lớp phải được thiết lập trước khi thân hàm khởi tạo được chạy. Trường cuối cùng sẽ là không phải có trình thiết lập ngầm được tạo cho nó, vì bạn không thể đặt giá trị mới trên biến cuối cùng.

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 
} 

Điều quan trọng là phải nhận ra rằng final ảnh hưởng đến biến, nhưng không phải đối tượng được chỉ định bởi biến. Tức là, final không biến đối tượng của biến là không thay đổi.

Ví dụ:

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 
} 

Trong ví dụ trên, biến address được đánh dấu là cuối cùng, vì vậy nó sẽ luôn trỏ đến đối tượng cụ thể của các nhà xây dựng new Address("anytown", "hi"). Tuy nhiên, đối tượng chính nó có trạng thái có thể thay đổi, do đó, nó hoàn toàn hợp lệ để thay đổi thành phố. Điều duy nhất được ngăn chặn bởi final được gán lại biến số address.

+0

"Trường cuối cùng của lớp phải được đặt trước khi phần thân của hàm tạo đang chạy." - Đây là phần đã ném tôi nhiều nhất. Mặc dù tôi đã thiết lập biến cuối cùng trong hàm tạo, nó thậm chí không xảy ra với tôi đó là lý do tôi nhận được lỗi. –

+0

@KevinSheehan Tôi đã bị loại bỏ bằng cách thiết lập trường cuối cùng trước nhà xây dựng. Đối với những người muốn làm điều này ở cấp độ nhà xây dựng, nếu nhà nước là một biến cuối cùng, nó có thể được thiết lập như vậy: Địa chỉ (this.city): state = "Hawaii"; – djm

Các vấn đề liên quan