Именованные, фабричные и перенаправляющие конструкторы

Большинство из нас знакомо с концепцией конструкторов. Они позволяют нам создавать разные экземпляры наших классов. Мы можем указать, от каких параметров должен зависеть класс при создании экземпляра, и скрыть внутреннюю логику инициализации.

У нас может быть много конструкторов для разных случаев использования или мы можем полагаться на конструктор по умолчанию.

В Dart конструкторы играют аналогичную роль, но имеют несколько вариаций, которых нет в большинстве языков программирования. В этой статье будут рассмотрены различные варианты использования и примеры конструкторов в Dart.

Во всех примерах для этой статьи мы будем использовать следующий класс:

Как начать работу с конструкторами в Dart

Если вы не укажете конструктор в Dart, он создаст для вас конструктор по умолчанию.

Это не означает, что вы увидите конструктор по умолчанию, созданный в вашем классе. Вместо этого при создании нового экземпляра вашего класса будет вызываться этот конструктор. У него не будет аргументов, и он вызовет конструктор суперкласса (без аргументов).

Чтобы объявить конструктор в своем классе, вы можете сделать следующее:

Как вы понимаете, должен быть лучший способ инициализировать поля нашего класса. А в Dart есть:

Подход, который мы использовали выше, - это просто синтаксический сахар для упрощения присваивания.

Именованные конструкторы

На других языках можно перегрузить конструктор. Это означает, что у вас могут быть разные конструкторы с одним и тем же именем, но с разной подписью (или другим набором аргументов).

В Dart это невозможно, но есть способ обойти это. Это называется именованными конструкторами. Предоставление вашим конструкторам разных имен позволяет вашему классу иметь много конструкторов, а также лучше представлять их варианты использования за пределами класса.

Конструктор withoutABS инициализирует переменную экземпляра hasABS значением false перед выполнением тела конструктора. Он известен как список инициализаторов, и вы можете инициализировать несколько переменных, разделенных запятыми.

Наиболее распространенный вариант использования списков инициализаторов - инициализация последних полей, объявленных вашим классом.

Примечание. Все, что находится справа от двоеточия (:), не имеет доступа к this.

Конструкторы Фабрики

Конструктор фабрики - это конструктор, который можно использовать, когда вы не обязательно хотите, чтобы конструктор создавал новый экземпляр вашего класса.

Это может быть полезно, если вы храните экземпляры своего класса в памяти и не хотите каждый раз создавать новый (или если операция по созданию экземпляра является дорогостоящей).

Другой вариант использования - если у вас есть определенная логика в вашем конструкторе для инициализации последнего поля, что не может быть выполнено в списке инициализаторов.

Продвинутые конструкторы

Dart также позволяет создавать конструкторы констант. Что именно это означает? Если ваш класс представляет объект, который никогда не изменится после его создания, вы можете извлечь выгоду из использования константного конструктора. Вы должны убедиться, что все поля вашего класса являются окончательными.

Если вы хотите, чтобы один конструктор вызывал другой конструктор изнутри, это называется перенаправляющими конструкторами.

Заключение

Каждый из обсуждаемых нами конструкторов имеет разные цели и варианты использования. Вы должны понять и определить, когда использовать каждый из них. Надеюсь, эта статья дала вам необходимые знания для этого.

Если вы хотите узнать больше о конструкторах Dart, вы можете отправиться в Языковой тур по Dart.