В спецификации Dart: Enhanced Constructors

Я — MADTeacher, автор книг по Dart/Flutter/ИИ в программировании и преподаватель. На канале разбираю свежие фичи языка и фреймворка, объясняю, как и когда их применять, и показываю всё на живых примерах кода. Меньше воды — больше практики: от конструкторов и метапрограммирования до производительности, интеропа и тестирования, а также поднимаю тему использования ИИ для разработки программных продуктов. Если хотите понимать Dart и Flutter в эпоху ИИ глубже — вы по адресу.

dartenhanced constructorsконструкторы

Замечен черновик новой фичи - Enhanced Constructors.

Какую же проблему она решает?

На данный момент Dart требует, чтобы вызовы суперконструкторов и инициализация final-полей выполнялись в специальном initializer list – то есть до открытия фигурных скобок конструктора. По словам разработчиков это создает дополнительные сложности для новичков и ограничивает гибкость самого конструктора. А именно:

  • 👉 Инициализация полей и вызов super() вынесены в отдельное место, что может сбивать с толку
  • 👉 Нельзя просто написать обычные присваивания и вызовы в теле конструктора, что мешает выполнять произвольную обработку аргументов перед инициализацией

Enhanced Constructors позволяют выполнять записи в поля (даже если они объявлены как final, но не в late) и вызывать суперконструкторы прямо в теле конструктора, как обычные операторы. А благодаря улучшенному анализу потока управления компилятор должен будет гарантировать, что:

  • 👉 Поля не читаются до их инициализации
  • 👉 Суперконструктор вызывается ровно один раз
  • 👉 Никакие поля не инициализируются дважды

Как изменится код?

// Before
class B {
  final int i;
  B(this.i);
  void m() { /* ... */ }
}

class C extends B {
  final int j;
  C(int x)
    : j = x + 1,
      super(x * 2) {
    m();
  }
}

// After
class C extends B {
  final int j;
  C(int x) {
    j = x + 1;
    super(x * 2);
    m();
  }
}

p.s. Мне кажется, в команде Dart нашелся какой-то маньяк конструкторов... иначе как объяснить такой набор: по-умолчанию, фабричный, именованный, константный, а теперь вот еще первичный, объявляющий и расширенный?👀

  • 👍 - больше конструкторов Богу конструкторов
  • 👌 - сомнительно, но Окей
  • 👎 - не вижу от него пользы

#dart_lang@madteacher_channel

Дискуссия

Boltology Tech | Nikita Sinyavin
С детства любил конструкторы Lego. Теперь вырос и развлекаюсь с конструкторами в Dart 😁
Eugene Voyner
😂😂😂😂😂😂😂😂😂
Nikolya.Y
Да что угодно лишь бы работало мне как новичку на одну фичу больше/меньше разницы нет
Денис Рева
У меня сразу идут ассоциации с C++
Присоединиться к обсуждению →

Читайте так же