深入解析:Android学Dart学习笔记第二节 常量
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
序言
上篇文章中我们学习了在Dart中定义变量,了解了var类型推断和显示类型声明,以及独特的dynamic类型和空安全机制,这篇文章我们学习常量的定义
final和const
对于Android的同学fianl属于老生常谈,不可变的可以用来修饰常量,const在kotlin语言中也出现过,也用来表示常量,那么他们两个为什么会同时出现?
官方文档

final

这里平平无奇,final(至少,其他的以后再说,了解的铜须可以在评论区说说)可以修饰隐式和显式的常量,表示该常量不可变。
const

下面是一个小小的尝试

这个尝试说明了文档中描述的
在声明变量的位置,将其值设置为编译时常量,比如数字、字符串、const 常量或在常量数字上进行的算术运算的结果
下面测试了这句话所说的常量中是否包含final声明的常量

最后的结论是不包含,const值的运算只能是由const修饰的常量,或固定值参与
还是文档

从这段中,可以学到const可以用来修饰值
下面测试修饰值

报错了,不可以这么写,因为pp不是一个类
下面我们创建一个类,试试是否可行

翻译:
正在调用的构造函数不是常量构造函数。
尝试从构造函数调用中移除’const’。
下面我们为创建的Point类增加一个const构造函数
这样是成功了,那官方样例中的[]为什么可以使用const修饰呢?![[]的类型](https://i-blog.csdnimg.cn/direct/65bf4ad10b2c42d4bef75cec01f5b21b.png)
可以看到[],array实际上是List类型的,我们看看list类型是如何定义的
这张图片有点混乱,List有abstract又有interface,还有implements,我们先不管他,可以看到他和Iterable有实现关系,继续看
看到这个图,我们就明白为了官方文档使用[]作为例子,
以及const的限制
还是文档

下面看案例说明
var p = [1];
p = [];
const p2 = [1];
p2 = [2];//这里编译不通过,因为p2是const变量,不能重新赋值
继续看文档

总的来说就是常量的值支持表达式,其实变量也没问题
Object a = 1;
var p = [
a as int
];
还是看文档

下面是final声明类对象的测试
下面是const修改对象字段的测试
var point = Point();
print("point.x: ${point.x}");
final a = point;
point.x = 2;
print("point.x: ${point.x} a.x: ${a.x}");
const b = point;// 编译错误:const变量必须在编译时初始化
成功案例
扩展
两个类型相同的const对象,值一致会复用同一个对象,而其他都是不同对象,及时class时const构造函数。
总结
final和const都表示常量,但const要求对象内所有字段(
Can’t define a const constructor for a class with non-final fields.
)
const的值必须编译时就确定,const和final都支持 类型检查和转换(is 和 as)、 集合中的 if 和 展开操作符(… 和 …?)
如有遗漏,欢迎评论区补充,万分感谢。

浙公网安备 33010602011771号