在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构造函数时能够使用不可变字段,而在使用普通的构造函数时能够使用可变字段。似乎是一个。
答案 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;
}
}