Ответ 1
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
.