【发布时间】:2020-07-07 20:07:59
【问题描述】:
我在 YouTube 上观看在线教程,导师说实例变量可以是 final 但不能是 const,因此如果你想要一个类级别的常量,然后将其设为静态 const。我的问题是,当我们有 const 关键字的工作是定义一个在整个变量中保持不变的变量时,有什么需要使用 static const。
【问题讨论】:
我在 YouTube 上观看在线教程,导师说实例变量可以是 final 但不能是 const,因此如果你想要一个类级别的常量,然后将其设为静态 const。我的问题是,当我们有 const 关键字的工作是定义一个在整个变量中保持不变的变量时,有什么需要使用 static const。
【问题讨论】:
根据this article:
“static”、“final”和“const”在 Dart 中表示完全不同的东西:
“静态” 表示成员在类本身而不是在 类的实例。这就是它的全部含义,它不用于 还要别的吗。 static 修改成员。
"final" 表示单一赋值:一个 final 变量或字段必须有 一个初始化器。一旦分配了一个值,最终变量的值就不能 被改变。 final 修改变量。
“const” 在 Dart 中具有更复杂和微妙的含义。 const 修改值。您可以在创建集合时使用它, 像 const [1, 2, 3],以及在构造对象时(而不是 new) 像 const Point(2, 3)。这里, const 表示对象的全部 深度状态可以完全在编译时确定,并且 对象将被冻结并完全不可变。
【讨论】:
我的问题是,当我们有 const 关键字,其工作是定义一个在整个变量中保持不变的变量时,有什么需要使用 static const。
我认为在类中声明 const 字段时需要添加关键字 static 的主要原因是可读性,因此您绝对确定您了解该变量在类的每个实例中都是相同的。
由于final 变量被允许(并且通常是)在类的每个实例中具有不同的值,因此可能会发生混淆,因为final 仅表示“一旦分配了值,最终变量的值就不能更改。”。
由于const 是编译时间常数,它对于类的所有实例将始终保持不变,这意味着它将始终为static。但是为了让开发者完全清楚,我们需要写static,即使编译器可以自己解决。
不过,这只是我的猜测。 :)
【讨论】:
假设成员上的const 不需要static,而您有:
class Foo {
const k = 42;
}
您如何访问它?
Foo.k 应该是合法的;由于值始终相同,因此您不需要先构造 Foo 对象。
Foo().k 呢?由于没有static 关键字,它看起来 也可能是合法的。但是,如果允许,那么您需要考虑并定义许多情况:
Foo fooInstance = null;
print(fooInstance.k);
print(fooInstance?.k);
class Derived extends Foo {
const k = 9;
}
fooInstance = Derived();
print(fooInstance.k);
对我来说,要求const 成员也是static 似乎更简单明了。
【讨论】: