Flutter/Dart final与const总结
使用final
修饰的变量必须进行初始化,一旦被赋值以后,不能被再次赋值,但是这个初始化的值在编译时是不确定的,只有在运行时,才能确定其值。
例如Flutter 官方教程中,有这么一行代码:
final wordPair = WordPair.random();
const
定义时,需要是个明确的值,修饰的变量它会在编译器以至于应用整个生命周期内都是不可变的常量,在内存中也只会创建一次,之后的每次调用都会复用第一次创建的对象。例如:
const city = '烟台';
var list = const[1,2,3];
var point = const Point(4,5);
const num = 1+2;
const time = DateTime.now(); //错误用法 这样会报错
const导致的不可变特性是可以传递的。如果有一个final修饰的成员变量,这个成员变量包含了一个集合,那么这个集合仍然是可变的, 但是如果包含的是const修饰的集合,那么集合内所有东西都是递归不可变的。例如:
final list0 = [1,2,3];
list0[0] = 4;print(list0.toString());//打印[4,2,3]
list1 = const[1,2,3];
list1[0] = 4;//这里会报错
扩展:static修饰符也能用来修饰变量, 被它修饰的成员变量,方法是属于类级别的, 并不属于对象。static变量直到运行期使用时才会进行实例化。