什么时候应该在 dart 中使用 final 字段、工厂构造函数或带有 getter 的私有字段?

Dom*_*ino 1 getter factory final dart

如果你能弄清楚如何重命名这个问题,我愿意接受建议。

在 Dart 语言中,可以编写一个带有 final 字段的类。这些是只能在构造函数体运行之前设置的字段。这可以在声明时(通常用于类内的静态常量),在声明构造函数或使用this.field速记时的初始化列表语法中:

class NumBox{
  final num value;
  NumBox(this.value);
}
Run Code Online (Sandbox Code Playgroud)

假设我实际上需要对实例创建进行一些处理,并且不能只是在构造函数之前初始化该字段。我可以切换到使用带有 getter 的私有非最终字段:

class NumBox{
  num _value;
  NumBox(num v) {
    _value = someComplexOperation(v);
  }
  num get value => _value;
}
Run Code Online (Sandbox Code Playgroud)

或者我可以使用工厂构造函数获得类似的行为:

class NumBox{
  final num value;
  factory NumBox(num v) {
    return new NumBox._internal(someComplexOperation(v));
  };
  NumBox._internal(this.value);
}
Run Code Online (Sandbox Code Playgroud)

几年前我尝试学习 Dart 时遇到了类似的问题,现在我有更多的包袱,我仍然不知道。什么是更聪明的方法来做到这一点?

Gün*_*uer 5

工厂构造函数是一种很好的方法,它允许不受限制地预先计算任何值,然后将这些值传递给普通构造函数以转发到最终字段。

另一种方法是初始化列表,它在构造函数体之前执行,因此允许初始化最终字段:

class NumBox{
  final num value;
  NumBox(num v) : value = someComplexOperation(v)
}
Run Code Online (Sandbox Code Playgroud)

在初始化列表中,您不允许读取,this因为实例尚未完全初始化。

DartPad 示例