static
,final
和const
在 Dart 中有着巨大的差别。
核心: static 修饰
members
, final 修饰variables
, const 修饰value
。
static
static 意味着成员是类变量,而不是实例变量。仅此而已,没有其他任何用图。static 修饰 *成员(members)*
。
final
final 意味着单次赋值:一个 final 修饰的 变量或 字段 必须
具有初始化赋值。一旦赋值,final 的变量就不能改变。 final 修饰 *变量(variables)*
。
const
const 的含义在 Dart 中有一些复杂和微妙。const 修饰 *value*
。 你可以用它创建于集合,例如 const [1,2,3]
,也可以构建一个类的实例,例如 const Point(2,3)
。const 意味着这些对象的所有状态都在编译期就确定了,另外这个对象将会被冻结并且完全不可改变。
Const 对象有一些有趣的属性和限制:
它们必须由编译期就能被计算出来的数据创建。一个 const 的对象不能使用运行时才能确定的值。
1+2
是一个合法的 const 表达式,但是new DateTime.now()
就是不合法的。它们是深入的,传递性的不可改变。如果你有一个 final 的集合字段,集合里面的内容是可以改变的。如果你有一个 const 的集合对象,集合里面的一切都是 const 的,都是不能改变的。
它们是
*规范化的*
,这点有些像字符串:对于一个 const 的 value,无论这个 value 被创建或者使用多少次,都是相同的。举例如下:
getConst() => cosnt[1,2];
main(){
var a = getConst();
var b = getConst();
print(a===b); // true
}
结语
final
:第一:如果你在运行时
才能获得的值,那么用 final 进行修饰。比如 http 请求结果,数据库请求结果。第二:final 修饰的对象,只要这个对象的字段不是final
或const
。那么他们是可以再次被赋值的。
const
:第一:编译期就能确定的值,那么用 final修饰。第二:如果你有一个 const 的对象,那么 const 对象里面的(字段)一切都是 const。不能再次进行赋值。
参考资料:
https://news.dartlang.org/2012/06/const-static-final-oh-my.html
https://stackoverflow.com/questions/50431055/what-is-the-difference-between-the-const-and-final-keywords-in-dart