如何在构造函数中初始化最终的类属性?

问题描述 投票:27回答:2

在Java中,您可以这样做:

class A {    
    private final int x;

    public A() {
        x = 5;
    }
}

在达特,我试过:

class A {    
    final int x;

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

我收到两个编译错误:

必须初始化最终变量'x'。

'x'不能用作定位器,因为它的最终版本。

有没有办法在Dart的构造函数中设置最终属性?

constructor dart final
2个回答
41
投票

您无法在构造函数体中实例化最终字段。有一个特殊的语法:

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

19
投票

您可以使用构造函数中的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);
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.