所以我正在做第一个例子 https://flutter.io/get-started/codelab/对于 Flutter,以及以下
步骤4:创建无限滚动的ListView,
我遇到了这段代码:
class RandomWordsState extends State<RandomWords> {
final _suggestions = <WordPair>[];
final _biggerFont = const TextStyle(fontSize: 18.0);
...
}
但我发现下面这行有点诡异。
final _biggerFont = const TextStyle(fontSize: 18.0);
我的问题是,分配一个的目的是什么?const
蚂蚁价值final
多变的?
我知道
编译时常量被规范化,即无论多少次
你写const MyObj(0, 0)
,你只创建一个对象。
这听起来可能很有用,但您可以简单地创建 const 变量来保存该值并使用该变量。
嗯,你不觉得这有点多余吗?我知道 Flutter 的开发人员想要创建一个编译时常量对象,但是嘿!您正在将该值分配给final
多变的。这在某种程度上是同一件事。
有什么想法吗?
UPDATE
我用谷歌搜索了一些定义,我发现
const
构造函数不能有主体并且它的类不能有
任何非最终字段
这就是我们使用const
关键词?因为如果你看看TextStyle https://github.com/flutter/flutter/blob/master/packages/flutter/lib/src/painting/text_style.dart类的设计,你会发现他们在这里做了完全相同的事情。
我个人认为
final _biggerFont = const TextStyle(fontSize: 18.0);
看起来像是一个错误,仅此一点就足以改变它。
该成员仅在同一个类内部使用,因此没有理由不使用它static
。这样就不会为该类的每个实例占用一个额外的内存位置,所有实例都指向同一个值。 (假设编译器无法识别该字段始终具有相同的值,并且只是在各处内联该值)。
如果该会员是static
,也可能是const
,所以我将其写为:
static const _biggerFont = TextStyle(fontSize: 18.0);
这假设代码是我通过搜索找到的final _biggerFont = const
.
如果同一个库中有一个子类覆盖_biggerFont
,那么它确实需要是一个实例变量。它仍然可能是一个getter那么,而不是一个字段。这是否能提高效率取决于类的使用方式,以及编译器对始终具有相同值的 Final 字段的优化程度。
无论如何,创建一个始终具有相同常量值的私有实例成员看起来应该只是一个静态常量,并且看起来像错误的代码很难阅读。出于这个原因,我会重写它(或记录它) - 以避免读者对为什么它是这样感到困惑。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)