Dart:修饰符 static final const
2018-08-13 本文已影响0人
jeffiano
阿里巴巴口碑Android开发内推
今天来说一下Dart语言中的这三个修饰符的异同。
static:用于修饰成员变量,这个变量是属于类的,而不是属于对象的,除此之外没有其他别的含义了,static修饰符的使用方式和Java类似。 static变量直到运行期被使用时才会实例化。
final:用于修饰变量,表示单赋值(single-assignment),使用final修饰的变量必须进行初始化,一旦被赋值之后,不能够再次被赋值,否则编译会报错。
const:含义稍显复杂。dart中const是用来修饰某个值的,可以通过它来创建集合:
var list = const [1, 2, 3];
或者用来构造对象:
var point = const Point(2, 3);
这里const表示Point对象的状态完全可以在编译期间确定,并且完全是不可变的。
被const修饰的对象有些特殊的属性和限制:
1.必须依靠编译期间就能够计算出来的数据进行创建,包括两种情况:
- 使用Dart内置数据类型的值(int double bool String List Map等等)进行赋值,或者使用内置数据类型的字面量通过基本运算得到的值,而不能依赖运行期计算出来的值,例如:
const num = 1 + 2;
但是new DateTime.now() 不行。
- const构造函数创建的对象,例如:
这里的Student类中定义了一个const构造函数,一个类能够定义 const 构造函数的前提是成员变量必须都是用final或const修饰的。
2.const导致的不可变性是可传递的,如果你有一个final修饰的成员变量,这个成员变量包含了一个集合,那么这个集合仍然是可变的。如果包含的是const修饰的集合,那么集合内的所有东西是递归地不可变的。
运行结果:
3.相同的const变量不会在内存中重复创建,如果表达式被调用了多次,则重用之前创建好的常量,或者用代码表达这一特性:
getConst() => const [1, 2];
main() {
var a = getConst();
var b = getConst();
identical(a, b); // =>true
}
其中identical用于检查两个引用是否指向同一个对象。
Flutter程序员公众号,关注Flutter相关话题~