Flutter - final vs const

269 阅读2分钟

Dart - final vs const

final和const均能用于定义常量,他们有什么区别呢🤔?

  1. 使用const和final定义的“常量定义”均不能被修改(实质是指针不可修改)。
final v1 = [1, 2];
final v2 = [1, 2];
v1 = v2; // Error: Can't assign to the final variable 'v1'.

const v1 = [1, 2];
const v2 = [1, 2];
v1 = v2;    // Error: Can't assign to the const variable 'v1'.
  1. 使用final定义的常量的“”可以被修改(实质是常量指针, 但并没有限定指针其所指向的值)。
final v1 = [1, 2];
v1[0] = 3;  // [3, 2]
v1.add(4);  // [3, 2, 4]

// 换成const会报错
  1. 使用const多次定义但是值都是一个。
// const
const v1 = [1, 2];
const v2 = [1, 2];
print(v1 == v2); // true

// final
final v1 = [1, 2];
final v2 = [1, 2];
print(v1 == v2); // false
  1. const不仅可以定义变量(variable),还可以定义值(value)
// 常量值不允许修改,但如果只定义常量,该指针可以指向其他变量
var v1 = const [1, 2];
v1[0] = 3;  // [3, 2] // 出错
v1.add(4);  // [3, 2, 4] // 报错

v1 = [1, 2, 3];
print(v1);  // ok [1, 2, 3]

// 所以以下两种定义是不相等的
// var v1 = const [1, 2] 
// const v1 = [1, 2]
  1. const是编译时,final是运行时, 理论上const会有些编译优化吧(猜测)。

总结

  • 鉴于const需要编译时,所以const一般用于定义基础类型的字面量对象(如int\bool\string\以及他们的复合对象诸如数组之类)
  • 在方法里是否需要使用final呢,答案是可以,但是并没有因此编译器有优化,所以没有必要,使用var就可以。(某个官方的谈话节目里提到的)
  • 不会变化的类属性建议使用final, 并在构造器中初始。
  • 注意final定义的常量只是指针不可修改,内容是可变的。

有哪里错的,欢迎留言