Flutterfullter

Flutter 中 Const,Static,Final 的巨大

2020-07-03  本文已影响0人  望穿秋水小作坊

static , finalconst 在 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 对象有一些有趣的属性和限制:

  1. 它们必须由编译期就能被计算出来的数据创建。一个 const 的对象不能使用运行时才能确定的值。1+2 是一个合法的 const 表达式,但是 new DateTime.now() 就是不合法的。

  2. 它们是深入的,传递性的不可改变。如果你有一个 final 的集合字段,集合里面的内容是可以改变的。如果你有一个 const 的集合对象,集合里面的一切都是 const 的,都是不能改变的。

  3. 它们是*规范化的*,这点有些像字符串:对于一个 const 的 value,无论这个 value 被创建或者使用多少次,都是相同的。举例如下:

getConst() => cosnt[1,2];
main(){
  var a = getConst();
  var b = getConst();
  print(a===b); // true
}

结语

final:第一:如果你在运行时才能获得的值,那么用 final 进行修饰。比如 http 请求结果,数据库请求结果。第二:final 修饰的对象,只要这个对象的字段不是finalconst。那么他们是可以再次被赋值的。

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

上一篇下一篇

猜你喜欢

热点阅读