ダーツには という概念がありfinal
ます。ほとんどの動的言語には、この概念がありません。
final とは何ですか? 何に使用しますか?
final
変数には任意の値を含めることができますが、一度割り当てられると、最終的な変数を他の値に再割り当てすることはできません。
例えば:
main() {
final msg = 'hello';
msg = 'not allowed'; // **ERROR**, program won't compile
}
final
オブジェクト内のインスタンス変数にも使用できます。コンストラクタ本体を実行する前に、クラスの final フィールドを設定する必要があります。final 変数には新しい値を設定できないため、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
}
上記の例では、変数は final としてマークされているため、コンストラクターaddress
によってインスタンス化されたオブジェクトを常に指します。new Address("anytown", "hi")
ただし、オブジェクト自体はミュータブルな状態を持っているため、都市を変更することは完全に有効です。によって防止される唯一のことは、変数final
を再割り当てすることです。address