可以在同一类中定义normal和const构造函数吗?

时间:2019-04-05 02:24:33

标签: dart

在Dart中,我看到可以在类中创建const构造函数。是否可以在使用相同字段的类中混合使用普通和const构造函数?还是打算总是为了创建可变和不可变的实例而分开使用类?

我尝试在同一类中创建普通和const构造函数。问题在于const构造函数需要final字段,因此,如果普通的构造函数要使用这些字段,则其实例字段将是不可变的。

void main() {
  Jank fj = Jank.normal(5, 'LOL');
  const cj = const Jank.fixed(6, 'HA');

  fj.a = 123;       //cannot do this, but want to
  cj.a = 456;       //cannot do this, is expected
}

class Jank {
  final int a;
  final String b;

  Jank.normal(this.a, this.b);
  const Jank.fixed(this.a, this.b);
}

我希望在使用const构造函数时能够使用不可变字段,而在使用普通的构造函数时能够使用可变字段。似乎是一个。

1 个答案:

答案 0 :(得分:2)

您可以在具有const构造函数的类上使用非const构造函数,但所有字段仍必须为final。

您还可以将new(隐式)与const构造函数一起使用(但不能相反)。

因此,与非const构造函数的不同之处在于,该构造函数可以具有主体,但不能执行太多操作,因为它无法更新类的状态。它只能调用对const实例外部状态的更改。

一种解决方法是使用Expando

构造函数初始值设定项列表允许更多表达式,因为它们不仅限于const上下文中仅允许的少数几个表达式。

因此,在整体混合中const和non-const受到很大限制,仅用于边缘情况。

您可以做的是创建一个不同的类,该类使用const构造函数实现该类,并使用工厂构造函数透明地实例化它。

class Foo {
  final int value;

  const Foo(this.value);

  factory Foo.nonConst(int val) => _Bar(val);
}

class _Bar implements Foo {
  int _value
  int get value() => _value;

  Bar(int val) {
    _value = val * 5;
  }
}