2012-09-14 13 views

答えて

23

final変数には任意の値を含めることができますが、一度割り当てられると、最終変数は他の値に再割当てできません。例えば

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

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 
} 

それはfinalが変数に影響を与えますが、オブジェクトが変数によって指さないことを認識することが重要です。つまり、finalは、変数オブジェクトを不変にしません。例えば

:上記の例で

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変数は、最終とマークされているので、常にnew Address("anytown", "hi")コンストラクタによってインスタンス化されたオブジェクトを指します。しかし、オブジェクト自体には変更可能な状態があるため、都市を変更することは完全に有効です。 finalによって防止された唯一のものは、address変数を再割り当てしています。

+0

"クラスの最後のフィールドは、コンストラクタ本体を実行する前に設定する必要があります。" - これは私を最も怒らせていた部分でした。コンストラクタの最終変数を設定していたにもかかわらず、エラーが発生したのは私には起こりませんでした。 –

+0

@KevinSheehan私は、コンストラクタの前に最終フィールドを設定することによって捨てられました。コンストラクタレベルでこれを実行しようとする人にとって、状態が最後の変数であれば、それは次のように設定できます:Address(this.city):state = "Hawaii"; – djm