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

问题描述 投票:1回答:1

在Dart中,我看到可以在类中创建const构造函数。是否可以使用相同的字段在类中混合normal和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构造函数时使用不可变字段,并在使用普通字段时使用可变字段。它似乎是一个或另一个。

dart
1个回答
2
投票

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

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

因此,与非const构造函数的区别在于构造函数可以有一个主体,但它不能做太多,因为它无法更新类状态。它只能调用const实例之外的状态的更改。

解决这个问题的方法是使用Expando

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

因此在整体混合中,const和非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;
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.