Константный конструктор
Константный конструктор объявляется с помощью ключевого слова const
перед именем конструктора. Такой конструктор позволяет создавать
объекты, значения которых известны на этапе компиляции. Класс,
содержащий константный конструктор, должен иметь все поля
объявленные как final. Объекты, созданные через константный
конструктор, автоматически становятся каноническими - Dart
переиспользует один и тот же экземпляр для одинаковых значений.
Константный конструктор не может иметь тело. Все поля класса
должны быть инициализированы через список инициализации или
через параметры конструктора. Если конструктор объявлен как
const, то и все его параметры должны быть final.
Синтаксис
class ClassName
{
final type field;
const ClassName(this.field);
}
Пример
Давайте создадим класс с константным конструктором и создадим два одинаковых объекта:
class Point
{
final int x;
final int y;
const Point(this.x, this.y);
}
void main()
{
const Point p1 = Point(1, 2);
const Point p2 = Point(1, 2);
print(identical(p1, p2));
}
Результат выполнения кода:
true
Как видите, p1 и p2 - это один и тот же объект,
потому что константные объекты с одинаковыми значениями
канонизируются.
Пример
Давайте используем константный конструктор в константном выражении, например, при создании константного списка:
class Point
{
final int x;
final int y;
const Point(this.x, this.y);
}
void main()
{
const List<Point> points = [
Point(1, 2),
Point(3, 4),
];
print(points);
}
Результат выполнения кода:
[Instance of 'Point', Instance of 'Point']
Пример
Давайте создадим именованный константный конструктор:
class Point
{
final int x;
final int y;
const Point(this.x, this.y);
const Point.origin() : x = 0, y = 0;
}
void main()
{
const Point p = Point.origin();
print(p.x);
print(p.y);
}
Результат выполнения кода:
0
0
Смотрите также
-
ключевое слово
decl,
которое объявляет класс -
именованный конструктор
named-constructor,
который создает дополнительные конструкторы -
список инициализации
initializer-list,
который инициализирует поля класса -
ключевое слово
static,
которое объявляет статические члены класса