Почему конечное поле должно быть инициализировано, когда оно становится обнуляемым?

#dart

#dart

Вопрос:

 class A {
  final int? b; // Error
}
  

Ошибка:

Конечная переменная ‘b’ должна быть инициализирована.

Поскольку поле b обнуляемо, его можно оставить неинициализированным и, следовательно, не требует инициализации. Но это выдает ошибку.

Комментарии:

1. Но оно объявлено как final неподвижное. конечные переменные / поля должны иметь инициализатор. защищенный от нуля dart этого не меняет.

2. @ChristopherMoore Но это могло бы быть null , верно? Итак, почему существует необходимость в инициализации, когда что-то может быть null ?

Ответ №1:

Неинициализация final поля, независимо от того, обнуляемо оно или нет, почти наверняка является ошибкой. Это не отличалось до того, как была введена защита от нуля.

Предположим, что final полям было разрешено неявно инициализироваться null . Затем в классе, таком как:

 class A {
  final int? b;
}
  

для b существования вообще не было бы смысла, поскольку оно было бы всегда null .

Но, возможно, A предоставляет конструктор, который мог бы инициализировать b не null значение:

 class A {
  final int? b;

  A();
  A.nonNull() : b = 42;
}
  

Но теперь нет способа определить, действительно ли A() конструктор по умолчанию хочет b , чтобы его инициализировали null , или программист просто забыл его инициализировать. Последнее гораздо более вероятно, поэтому ошибка Dart заключается в том, что требуется явная инициализация.

Комментарии:

1. There would be no point for b to exist at all since it'd always be null. — Даже это было моей первоначальной мыслью, когда я увидел что-то подобное где-то в документах. (Я вернусь к этому позже сегодня).

2. Не помню, где я это видел. Но sir b должен быть инициализирован в вашем коде в A() том виде, в каком он отмечен final .

3. Ну, да, A() необходимо инициализировать b , поскольку оно помечено final . В этом весь смысл; в вашем вопросе спрашивается, зачем его нужно инициализировать.

4. Вы думаете о dart.dev/null-safety / … ? HttpResponse.ok Конструктор не инициализируется error , но я думаю, что это, вероятно, ошибка.

5. @iLoveDocs Я подал github.com/dart-lang/site-www/issues/2586 чтобы исправить документы. Спасибо, что указали на это.

Ответ №2:

Сначала вам нужно инициализировать b как int b или string b; Присвоение значения необязательно.

Комментарии:

1. Сэр, что undefined в Dart?

2. Извините, я обновил ответ. Я отвечаю в общем виде, не относящемся к Dart.

3. Ваш ответ все еще очень неясен, и он также кажется вопиюще неправильным.

4. @RahulBeniwal Что вы на самом деле хотите сказать в своем ответе? Пожалуйста, внимательно прочитайте мой вопрос, прежде чем публиковать ответ.