在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构造函数时使用不可变字段,并在使用普通字段时使用可变字段。它似乎是一个或另一个。
您可以在具有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;
}
}