在刚开始学习Dart
的时候,对于const, final, static
这几个关键字很容易产生困惑,究竟该在那种场景下使用它们,这篇文章就从如下几个方面总结一下这三个关键字:函数
const
有如下几种应用场景:学习
const
用在=
左边当const
用在=
左边时,其做用是 声明变量,它要求 必须在声明变量时赋值,一旦赋值就不容许修改,而声明值必定要是编译时常数。ui
const
在声明变量时能够省略变量的类型,var, int
等。this
这里的关键点在于区分 什么是编译时常数,有如下几种场景:spa
const
变量void main() {
const a = 1;
const b = 'hello';
const c = a;
}
复制代码
void main() {
const a = 1;
const b = a > 1 ? 2 : 1;
}
复制代码
const
修饰,对象的构造函数必须用const
修饰。void main() {
const a = const [1,2,3];
const b = ConstObject(2);
b.log();
}
class ConstObject {
final value;
const ConstObject(this.value);
log() {
print(value);
}
}
复制代码
const
用在等号右边当const
用在=
右边,其做用是 修饰值,它意味着对象的整个深度状态能够在编译时彻底肯定,而且对象将被冻结而且彻底不可变。code
通常用于修饰集合,它要求两点:对象
void main() {
var c = 2;
//ERROR, 集合元素必须是编译时常数。
var a = const [c,2,3];
}
复制代码
void main() {
const a = const [1,2,3];
//ERROR, 不容许修改。
a[1] = 2;
}
复制代码
const
修饰类的构造函数当const
修饰类的构造函数时,它要求该类的全部成员都必须是final
的。递归
class ConstObject {
final value;
//ERROR, 必须是 final 变量。
int value2;
const ConstObject(this.value);
log() {
print(value);
}
}
复制代码
final
的要求就是 其声明的变量在赋值以后就再也不改变,它并不要求=
的右边是编译时常数。字符串
final
有两种场景:string
ClassV({this.a})
,或者初始化列表的方式赋值。static
的概念相对来讲就比较容易理解了,它的做用是 声明类的成员变量,使得多个相同类型的类对象共享同一个成员变量的实例。
const
变量必须同时被声明为static
的。const
变量,变量命名方式应使用全大写加下划线。const
变量只能在定义的时候初始化。final
变量能够在构造函数参数列表或者初始化列表中初始化。static
。下面的表格总结了如何选取关键字,判断的顺序依次往下。
判断顺序 | 关键词 |
---|---|
值是编译时常数 | static const |
值不是编译时常数,但全部类都共享同一个实例 | static final :在声明的时候就能肯定值,而且再也不改变;static :不能肯定。 |
各个类对象持有不一样的实例,但只能被赋值一次 | final |
其它 | 普通定义 |
判断条件 | 关键词 |
---|---|
常量 | const |
很是量,但在声明时就能肯定值,而且不但愿被改变 | final |
其它 | 普通定义 |