web-dev-qa-db-fra.com

Comment initialiser une propriété de classe finale dans un constructeur?

Dans Java vous êtes autorisé à faire ceci:

class A {    
    private final int x;

    public A() {
        x = 5;
    }
}

A Dart, j'ai essayé:

class A {    
    final int x;

    A() {
        this.x = 5;
    }
}

Je reçois deux erreurs de compilation:

La dernière variable "x" doit être initialisée.

et

'x' ne peut pas être utilisé comme setter car c'est final.

Existe-t-il un moyen de définir les propriétés finales dans le constructeur dans Dart?

40
Blackbam

Vous ne pouvez pas instancier les champs finaux dans le corps du constructeur. Il existe une syntaxe spéciale pour cela:

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));
}
57
w.brian

Vous pouvez le raccourcir encore plus avec this. syntaxe dans le constructeur (décrite dans 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));
}

Si vous avez une initialisation plus compliquée, vous devez utiliser le constructeur d'usine et le code devient:

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);
  }
}
23
rkj