所以我正在为 Flutter 做第一个示例,在步骤 4:创建无限滚动 ListView下,
我遇到了这段代码:
class RandomWordsState extends State<RandomWords> {
final _suggestions = <WordPair>[];
final _biggerFont = const TextStyle(fontSize: 18.0);
...
}
Run Code Online (Sandbox Code Playgroud)
但我发现下面这行有点诡异。
final _biggerFont = const TextStyle(fontSize: 18.0);
Run Code Online (Sandbox Code Playgroud)
const
我的问题是,将ant 值赋给变量的目的是什么final
?
我知道
编译时常量是规范化的,即无论你写多少次
const MyObj(0, 0)
,你都只创建一个对象。
这听起来可能很有用,但您可以简单地创建 const 变量来保存该值并使用该变量。
嗯,你不觉得这有点多余吗?我知道 Flutter 的开发人员想要创建一个编译时常量对象,但是嘿!您正在将该值分配给一个final
变量。这在某种程度上是同一件事。
有什么想法吗?
更新
我用谷歌搜索了一些定义,我发现
const
构造函数不能有主体,并且它的类不能有任何非最终字段
这就是我们使用关键字的原因吗const
?因为如果您查看该类TextStyle
的设计,您会发现他们在这里做了完全相同的事情。
我个人认为
final _biggerFont = const TextStyle(fontSize: 18.0);
Run Code Online (Sandbox Code Playgroud)
看起来像是一个错误,仅此一点就足以改变它。
该成员仅在同一个类内部使用,因此没有理由不创建它static
。那么它就不会为该类的每个实例占用一个额外的内存位置,所有实例都指向相同的值。(假设编译器无法识别该字段始终具有相同的值,并且只是在各处内联该值)。
如果成员是static
,那么它也可能是const
,所以我将其写为:
static const _biggerFont = TextStyle(fontSize: 18.0);
Run Code Online (Sandbox Code Playgroud)
这假设代码是我通过搜索找到的final _biggerFont = const
。
如果同一个库中有一个子类重写了_biggerFont
,那么它确实需要是一个实例变量。那么它仍然可能是一个吸气剂而不是一个字段。这是否能提高效率取决于类的使用方式,以及编译器对始终具有相同值的 Final 字段的优化程度。
无论如何,创建一个始终具有相同常量值的私有实例成员看起来应该只是一个静态常量,并且看起来像错误的代码很难阅读。出于这个原因,我会重写它(或记录它) - 以避免读者对为什么它是这样感到困惑。
const
值被规范化。
这意味着无论您的代码包含多少次
final _biggerFont = const TextStyle(fontSize: 18.0);
Run Code Online (Sandbox Code Playgroud)
只会有一个const TextStyle(fontSize: 18.0)
实例。
对类的字段使用 const 需要static
,这将不允许使用对 的实例的引用来访问其值RandomWordsState
。
对于具有 const 构造函数的类有不同的偏好
http://dart-lang.github.io/linter/lints/avoid_field_initializers_in_const_classes.html
避免 const 类中的字段初始值设定项。
你应该写 get x => const expr; 而不是 Final x = const expr; 并且不分配无用的字段。截至 2018 年 4 月,对于 VM 来说是这样,但对于将编译为 JS 的代码则不然。
和顶级字段
http://dart-lang.github.io/linter/lints/prefer_const_declarations.html
首选使用 const 进行 const 声明。
Const 声明对热重载更加友好,并且如果实例化引用此声明,则允许使用 const 构造函数。
IDE 还建议用常量值初始化的局部变量替换final
为const
我还没有找到这个建议的来源,但它是有道理的,因为局部变量可以const
没有static
归档时间: |
|
查看次数: |
4472 次 |
最近记录: |