Как мне инициализировать конечное свойство класса в конструкторе?
В Java вы можете сделать это:
class A {
private final int x;
public A() {
x = 5;
}
}
В Дарт я попробовал:
class A {
final int x;
A() {
this.x = 5;
}
}
Я получаю две ошибки компиляции:
Последняя переменная 'x' должна быть инициализирована.
а также
'x' не может быть использован как установщик, потому что он финальный.
Есть ли способ установить конечные свойства в конструкторе в Dart?
Ответы
Ответ 1
Вы не можете создавать конечные поля в теле конструктора. Для этого есть специальный синтаксис:
class Point {
final num x;
final num y;
final num distanceFromOrigin;
// Old syntax
// Point(x, y) :
// x = x,
// y = y,
// distanceFromOrigin = sqrt(pow(x, 2) + pow(y, 2));
// New syntax
Point(this.x, this.y) :
distanceFromOrigin = sqrt(pow(x, 2) + pow(y, 2));
}
Ответ 2
Вы можете сделать это еще короче с this.
синтаксис в конструкторе (описан в https://www.dartlang.org/guides/language/language-tour#constructors):
class Point {
final num x;
final num y;
final num distanceFromOrigin;
Point(this.x, this.y)
: distanceFromOrigin = sqrt(pow(x, 2) + pow(y, 2));
}
Если у вас есть более сложная инициализация, вы должны использовать конструктор фабрики, и код становится:
class Point {
final num x;
final num y;
final num distanceFromOrigin;
Point._(this.x, this.y, this.distanceFromOrigin);
factory Point(num x, num y) {
num distance = distanceFromOrigin = sqrt(pow(x, 2) + pow(y, 2));
return new Point._(x, y, distance);
}
}