Flutter 知識梳理 (Dart) - Dart 中 static, final, const 區別

1、基本概念

在剛開始學習Dart的時候,對於const, final, static這幾個關鍵字很容易產生困惑,究竟該在那種場景下使用它們,這篇文章就從如下幾個方面總結一下這三個關鍵字:函數

  • 基本概念
  • 一些要注意的點
  • 在何種場景下,使用哪一種關鍵字

1.1 const

const有如下幾種應用場景:學習

(1) const用在=左邊

const用在=左邊時,其做用是 聲明變量,它要求 必須在聲明變量時賦值,一旦賦值就不容許修改,而聲明值必定要是編譯時常數ui

const在聲明變量時能夠省略變量的類型,var, int等。this

這裏的關鍵點在於區分 什麼是編譯時常數,有如下幾種場景:spa

  • 數值、字符串、其它的const變量
void main() {
  const a = 1;
  const b = 'hello';
  const c = a;
}
複製代碼
  • 表達式。表達式的全部值都是編譯時可知的。
void main() {
  const a = 1;
  const b = a > 1 ? 2 : 1;
}
複製代碼
  • 集合或對象。集合必須用const修飾,對象的構造函數必須用const修飾。
void main() {
  const a = const [1,2,3];
  const b = ConstObject(2);
  b.log();
}

class ConstObject {
  
  final value;
  
  const ConstObject(this.value);
  
  log() {
    print(value);
  }
}
複製代碼

(2) const用在等號右邊

const用在=右邊,其做用是 修飾值,它意味着對象的整個深度狀態能夠在編譯時徹底肯定,而且對象將被凍結而且徹底不可變。code

通常用於修飾集合,它要求兩點:對象

  • 集合的元素必須是遞歸的編譯時常數,也就是上面提到的三種狀況。
void main() {
  var c = 2;
  //ERROR, 集合元素必須是編譯時常數。
  var a = const [c,2,3];
}
複製代碼
  • 不容許對集合作任何改變。
void main() {
  const a = const [1,2,3];
  //ERROR, 不容許修改。
  a[1] = 2;
}
複製代碼

(3) const修飾類的構造函數

const修飾類的構造函數時,它要求該類的全部成員都必須是final的。遞歸

class ConstObject {
  
  final value;
  //ERROR, 必須是 final 變量。
  int value2;
  
  const ConstObject(this.value);
  
  log() {
    print(value);
  }
}
複製代碼

1.2 final

final的要求就是 其聲明的變量在賦值以後就再也不改變,它並不要求=的右邊是編譯時常數。字符串

final有兩種場景:string

  • 文件中的變量聲明:必須在聲明時賦值。
  • 類的成員變量聲明:能夠在聲明時賦值,也能夠經過構造函數賦值語法糖ClassV({this.a}),或者初始化列表的方式賦值。

1.3 static

static的概念相對來講就比較容易理解了,它的做用是 聲明類的成員變量,使得多個相同類型的類對象共享同一個成員變量的實例

2、一些要點

2.1 const

  • 聲明類成員變量時,const變量必須同時被聲明爲static的。
  • const變量,變量命名方式應使用全大寫加下劃線。
  • const變量只能在定義的時候初始化。

2.2 final

  • final變量能夠在構造函數參數列表或者初始化列表中初始化。

2.3 static

  • 在文件中,變量不能聲明爲static

3、在何種場景下,使用哪一種關鍵字

下面的表格總結了如何選取關鍵字,判斷的順序依次往下。

3.1 類

判斷順序 關鍵詞
值是編譯時常數 static const
值不是編譯時常數,但全部類都共享同一個實例 static final:在聲明的時候就能肯定值,而且再也不改變;static:不能肯定。
各個類對象持有不一樣的實例,但只能被賦值一次 final
其它 普通定義

3.2 文件

判斷條件 關鍵詞
常量 const
很是量,但在聲明時就能肯定值,而且不但願被改變 final
其它 普通定義
相關文章
相關標籤/搜索