在剛開始學習Dart
的時候,對於const, final, static
這幾個關鍵字很容易產生困惑,究竟該在那種場景下使用它們,這篇文章就從如下幾個方面總結一下這三個關鍵字:函數
const
有如下幾種應用場景:學習
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);
}
}
複製代碼
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;
}
複製代碼
const
修飾類的構造函數當const
修飾類的構造函數時,它要求該類的全部成員都必須是final
的。遞歸
class ConstObject {
final value;
//ERROR, 必須是 final 變量。
int value2;
const ConstObject(this.value);
log() {
print(value);
}
}
複製代碼
final
的要求就是 其聲明的變量在賦值以後就再也不改變,它並不要求=
的右邊是編譯時常數。字符串
final
有兩種場景:string
ClassV({this.a})
,或者初始化列表的方式賦值。static
的概念相對來講就比較容易理解了,它的做用是 聲明類的成員變量,使得多個相同類型的類對象共享同一個成員變量的實例。
const
變量必須同時被聲明爲static
的。const
變量,變量命名方式應使用全大寫加下劃線。const
變量只能在定義的時候初始化。final
變量能夠在構造函數參數列表或者初始化列表中初始化。static
。下面的表格總結了如何選取關鍵字,判斷的順序依次往下。
判斷順序 | 關鍵詞 |
---|---|
值是編譯時常數 | static const |
值不是編譯時常數,但全部類都共享同一個實例 | static final :在聲明的時候就能肯定值,而且再也不改變;static :不能肯定。 |
各個類對象持有不一樣的實例,但只能被賦值一次 | final |
其它 | 普通定義 |
判斷條件 | 關鍵詞 |
---|---|
常量 | const |
很是量,但在聲明時就能肯定值,而且不但願被改變 | final |
其它 | 普通定義 |