Подтвердить что ты не робот

Что делает последний модификатор в Dart?

У Дарта есть понятие final. Большинство динамических языков не имеют этой концепции.

Что является окончательным и для чего я его использую?

4b9b3361

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