web-dev-qa-db-ja.com

コンストラクターで最終クラスプロパティを初期化するにはどうすればよいですか?

Javaでは、これを行うことができます。

class A {    
    private final int x;

    public A() {
        x = 5;
    }
}

Dartで、私は試しました:

class A {    
    final int x;

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

2つのコンパイルエラーが発生します。

最終変数「x」を初期化する必要があります。

そして

「x」は最終的なため、セッターとして使用できません。

Dartのコンストラクタに最終的なプロパティを設定する方法はありますか?

40
Blackbam

cannotコンストラクター本体の最終フィールドをインスタンス化します。そのための特別な構文があります:

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

コンストラクターで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);
  }
}
23
rkj