Замечен черновик новой фичи - 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

Дискуссия