題記:不到最后時刻,,千萬別輕言放棄,,無論結(jié)局成功與否,,只要你拼博過,,盡力過,,一切問心無愧
本文描述 Dart 中 const 關(guān)鍵字與 final 關(guān)鍵字的基本使用知識點(diǎn)以及對比區(qū)別 本文章首發(fā)于微信公眾號(biglead) 我的大前端生涯 ,,同步刊登各技術(shù)論壇,。
1 const 、final 使用場景1.1 finalfinal 用來修飾變量 只能被賦值一次,,在運(yùn)行時賦值,,所謂運(yùn)行時 就是當(dāng)程序執(zhí)行到這塊代碼時才會對final 修飾的變量進(jìn)行賦值。 應(yīng)用場景一如下圖所示,,當(dāng) final 使用在類中時,,在聲明變量時,你必須對其初始化賦值
當(dāng) final 運(yùn)用在 StatefulWidget 中時,,用來修飾變量時:
這種情況使用 final 修飾的變量看似沒有進(jìn)行初始化賦值,,但是不違背 final 修飾的變量在運(yùn)行時賦值的理解,因為只有當(dāng)定義的 StatefulWidget 被初始化使用時,,這里 final 修飾的變量才會被賦值,當(dāng)然也是賦值一次,。 所以結(jié)論是 :final 可用來修飾變量,,修飾的變量在運(yùn)行時被賦值,只可被賦值一次,,所以修飾的變量內(nèi)容也稱為常量,。 核心思想是:運(yùn)行時賦值,、只能被賦值一次
1.2 const 的使用場景const 可用來修飾變量、修飾常量構(gòu)造函數(shù),,修飾的變量只可被賦值一次,。 const 可用來修飾的變量只可賦值一次,const 修飾的變量會在編譯器以至于應(yīng)用整個生命周期內(nèi)都是不可變的常量,,在內(nèi)存中也只會創(chuàng)建一次,,之后的每次調(diào)用都會復(fù)用第一次創(chuàng)建的對象。 ///全局常量 聲明 const String name = "張三";
class TestPage2 {
///類常量 規(guī)范要求必須使用 static 修飾 static const String name = "張三";
void test(){ ///方法塊常量 const String name = "張三"; } }
const 可用來修飾常量構(gòu)造函數(shù),,常用于定義枚舉類型,,如下代碼清單 1-2-1 所示 /// 代碼清單 1-2-1 ///訂單類型 class OrderStatus {
static const OrderStatus notDeliver = const OrderStatus("待發(fā)貨",1); static const OrderStatus hasBeenShipped = const OrderStatus("已發(fā)貨",2); static const OrderStatus haveTheGoods = const OrderStatus("已收貨",2); const OrderStatus(this.statusName,this.statusNumber);
final String statusName; final int statusNumber; }
使用如下 代碼清單 1-2-2 所示: /// 代碼清單 1-2-2 class TestClass5{
///判斷訂單類型 void test(OrderStatus orderStatus){
switch (orderStatus) { case OrderStatus.notDeliver: break; case OrderStatus.hasBeenShipped: break; case OrderStatus.haveTheGoods: break; default: break; } }
2 final 與 const 的不同點(diǎn)2.1 final 與 const 修飾的變量取值時機(jī)不同所謂取值時機(jī)不同,指的是 const 修飾的變量是在編譯時已確定下來的值,,而 final 修飾的變量是在運(yùn)行時才確定下來的,。 const 修飾的變量是在編譯期,程序運(yùn)行前就有確定值,。 使用 const 修飾的常量的值,,必須由可在編譯時可計算出結(jié)果的。對于在運(yùn)行時需要獲取的值是不可修飾的,,如下圖所示:
2.2 應(yīng)用范疇不同final 只可用來修飾變量,, const 關(guān)鍵字即可修飾變量也可用來修飾 常量構(gòu)造函數(shù) 2.3 相同內(nèi)容對象創(chuàng)建不同如下代碼清單 2-3-1 ,雖然創(chuàng)建了兩個對象list1和list2,,但是內(nèi)容一致且都是const對象,,所以其指向的是同一對象: /// 代碼清單 2-3-1 ///單元測試 test(" 測試1 ", () { const List<int> list1 = [1, 2, 3]; const List<int> list2 = [1, 2, 3];
// 輸出結(jié)果為true 比較的是指針指向 print(list1 == list2);
// 輸出結(jié)果為true 比較指針指向同時也比較內(nèi)容 print(identical(list1, list2));
});
如下代碼清單 2-3-2 ,final聲明的變量,,即使內(nèi)容相同,,也是重新創(chuàng)建新的對象: /// 代碼清單 2-3-2 ///單元測試 test(" 測試2 ", () { final List<int> list1 = [1, 2, 3]; final List<int> list2 = [1, 2, 3];
// 輸出結(jié)果為false 比較的是指針指向 print(list1 == list2);
// 輸出結(jié)果為false 比較指針指向同時也比較內(nèi)容 print(identical(list1, list2));
});
|