"static", "final", "const" 在Dart中意味着完全不同的东西:
"static" 表示成员在类本身上可用,而不是在类的实例上。 这就是它的意思,并没有用于其他地方。 static修饰成员。
"final" 表示单一赋值:final变量或字段必须初始化。 一旦赋值,就不能改变final变量的值。 final修饰变量。
"const" 的含义在Dart中有点复杂和微妙。 const修饰值。 您可以在创建集合时使用它,例如const [1,2,3] ,以及构造对象(代替new),比如const Point(2,3)。这里,const意味着对象的整个深度状态可以在编译时完全确定,并且对象将被冻结并完全不可变。
-
const对象有几个有趣的属性和限制:
- 必须根据可在编译时计算的数据创建它们。 const对象无法访问运行时需要计算的任何内容。 1 + 2是一个合法的const表达式,但new DateTime.now()不是(合法的const表达式)。
- 它们是深层不能改变的。 如果你有包含集合的final字段,则该集合仍然可变。 如果你有一个const集合,那么它中的所有东西也必须是递归的const。
- 它们是规范化的。 这有点像字符串内联:对于任何给定的const值,无论const表达式被计算多少次,都将创建并重用单个const对象。 也就是说:
getConst() => const [1, 2]; main() { var a = getConst(); var b = getConst(); print(a === b); // true }
我认为Dart在保持语义和关键字清晰明确方面做得非常好。 (曾经有一段时间将const用于const和final。这令人困惑。)唯一的缺点是,当你想指出一个单一赋值的成员和类本身时,你必须使用两个关键字:static final。