Dart(Flutter)中的常量构造函数

4

有人能解释一下常量构造函数的优点吗?如果我有一个 Stateful widget。

class X extends StatefulWidget {
  const X(this.a, this.b,...);
  A a;
  B b;
...
}

我不理解为什么要使用 const。如果我理解正确,const 意味着它在编译时已知,但这有什么作用呢?通常属性 ab 等在编译时是未知的,在运行时才会确定,那么 const 构造函数的目的是什么呢?

2个回答

7
你当前的代码不能有一个 const 构造函数,因为类中的某些成员变量没有标记为 finalconst 构造函数的目的是,如果你在编译时使用相同的参数创建同一类的多个实例(所以所有参数都可以由编译器确定,而不依赖于运行时),它们将在内存中共享同一实例。这仅在所有成员变量都是 final 的情况下才被允许。
因此,在特定情况下(例如 dart:convert 中的某些类),使用 const 构造函数可能会带来潜在的性能和内存改进。但是,你必须像这样调用 const 构造函数: const MyClass(); 以获得这种 const 行为。否则,const 仍然可以像普通构造函数一样使用,以获取类的普通实例。
个人而言,如果你有一个只包含指向其他 const 对象的 final 变量的类,即使永远不会使用 const 构造函数,也没有理由不创建 const 构造函数。但是,你通常只能在简单数据类上这样做。
但是不创建 const 构造函数也完全可以。

谢谢。我在问题中忘记将成员变量标记为“final”。这是否意味着,如果我使用一个成员变量a,它在编译时不是已知的,而是例如从服务器加载的,那么const构造函数就没有效果了?类似于a = await loadFromServer(); X x = const X(a),因为a不是常量? - König Wey
由于a不是可以在编译时确定的值,因此您不应该能够这样做。在调用const构造函数时,使用const关键字有相当严格的规则。 - julemand101

1
常量构造函数是创建常量对象的构造函数。常量对象是其值无法更改的对象。使用关键字const声明常量构造函数。
换句话说,如果类产生的对象在其整个生命周期中都打算保持不变,包括其变量的值,您可以选择将它们指定为编译时常量。
通过将这些对象标记为编译时常量,您确保它们的值在编译期间设置,并在运行时保持恒定。这可以提供诸如性能改进和减少内存消耗等好处,特别是在重复使用相同值的情况下。
要实现这一点,您可以使用诸如为变量使用final关键字并确保在初始化后不执行可变操作等技术。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接