19
A
答えて
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
変数を再割り当てしています。
関連する問題
- 1. 修飾子
- 2. private修飾子
- 3. Gtk keypress修飾子
"クラスの最後のフィールドは、コンストラクタ本体を実行する前に設定する必要があります。" - これは私を最も怒らせていた部分でした。コンストラクタの最終変数を設定していたにもかかわらず、エラーが発生したのは私には起こりませんでした。 –
@KevinSheehan私は、コンストラクタの前に最終フィールドを設定することによって捨てられました。コンストラクタレベルでこれを実行しようとする人にとって、状態が最後の変数であれば、それは次のように設定できます:Address(this.city):state = "Hawaii"; – djm