Модификаторы final и const по своей сути очень похожи. Переменные, впереди типа которых ставятся эти модификаторы не могут изменяться в процессе выполнения программы. Ключевое их отличие заключается в том, что константные переменные должны быть инициализированы в момент объявления, а переменные с модификатором final можно инициализировать позже, но только один раз:
final int a;
const int b = 10;
a = 4; // ok
b = 5; // ошибка: Постоянным переменным нельзя присвоить значение
a = 3; // ошибка: Конечная переменная 'a' может быть инициализирована только один раз
Тип, в случае использования данных модификаторов, можно явно не указывать. Он будет выведен Dart автоматически.
Ключевое слово const можно использовать не только для объявления неизменяемых переменных. Его еще используют для создания постоянных значений и объявления конструкторов, посредством которых создаются неизменяемые значения. Благодаря этому любая переменная может иметь неизменяемое значение:
// нельзя добавлять элементы средством метода add
var first = const [];
final second = const [];
const third = [];
first = const [10, 3, 23]; // ok
second = const [10, 3, 23]; // error
third = const [10, 3, 23]; // error
first[0] = 30; // Неподдерживаемая операция: Невозможно изменить немодифицируемый список
Модификатор late был добавлен в версии Dart 2.12 и имеет два варианта использования:
Отличие final от late заключается в том, что переменные с модификатором final не могут быть объявлены на верхнем уровне кода. При этом, переменные, объявленные с одним из этих модификаторов, должны быть проинициализированы до их использования. Иначе в процессе выполнения приложение выбросит исключение:
late String name;
final int variable; // ошибка, "variable" объявлена в верхнем уровне кода
void main(List<String> arguments) {
final int variable; // ok
// print(name);
// LateInitializationError: Field 'name' // has not been initialized
name = 'Михаил';
print(name); // ok
}