Как мне инициализировать конечное свойство класса в конструкторе?

В 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);
  }
}