Модификаторы final, const и late :: Cетевой уголок Majestio

Модификаторы final, const и late


Модификаторы final и const по своей сути очень похожи. Переменные, впереди типа которых ставятся эти модификаторы не могут изменяться в процессе выполнения программы. Ключевое их отличие заключается в том, что константные переменные должны быть инициализированы в момент объявления, а переменные с модификатором final можно инициализировать позже, но только один раз:

final int a; 
const int b = 10; 
a = 4; // ok 
b = 5; // ошибка: Постоянным переменным нельзя присвоить значение 
a = 3; // ошибка: Конечная переменная 'a' может быть инициализирована только один раз

Тип, в случае использования данных модификаторов, можно явно не указывать. Он будет выведен Dart автоматически.

const

Ключевое слово 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

Модификатор late был добавлен в версии Dart 2.12 и имеет два варианта использования:

  1. Для объявления переменной, не хранящей значение null, инициализация которой происходит уже после ее объявления
  2. Для ленивой инициализации переменной

Отличие 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 
}
Рейтинг: 0/5 - 0 голосов