學習 Kotlin 系列:被凍結的時間 const val

學習 Kotlin 系列:被凍結的時間 const val

更新於 發佈於 閱讀時間約 3 分鐘

賦值 (Assign Value) 想成套繩圈的動作, var 的繩圈是可以鬆綁重來的,val 套住對方就不能換了,而進階版 const val 綁住對方之後,對方的時間就被凍結了。

其實,以 Kotlin 的程式語言設計來說,比起賦值 (Assign Value),用賦址 (Assign Reference) 來形容更為恰當,指定的是位址 (Reference, Address) 。開發的朋友可能聽過,以值呼叫,以位址呼叫(Call by value, Call by reference)。前者直接,後者間接。 Kotlin 全部都是 Call by reference 。

舉例來說,當我想呼叫小隊長小李時,前者是直接呼叫小李,後者呼叫的是小隊長。表面上結果是相同的,但其實只是現在相同。

以值來說,值因為是單純沒有指定性的,呼叫的只是小李的名字,而不是小李的人,當隔壁隊伍調來一個名字也是小李的人,電腦是辨別不出差異的。

以位址來說,假設小隊長是 var 設定,而這個呼叫延遲了數十年,也許那時已經換小小李上任小隊長,那麼結果就大大不同了;而如果是 val 設定,呼叫的還是小李,只是可能小李已經老了;而 const val 設定,讓小李一開始就是不會老的英靈

const val 時間凍結的效果自編譯 (Compile time) 完成起,相對於大部分變數是執行時 (Run time) 決定, const val 的設計不同,編譯時 (Compile time) 就決定了,也再不會變,所以 const val 只能寫在最頂層或是物件,因為這兩者也是編譯時決定。

const val 只能寫在最頂層或是物件。

const val 只能寫在最頂層或是物件。

編譯 (Compile) 就是把我們寫的高階語言翻譯成電腦可以理解的機器語言,如果要細述過程會花太多時間,也不是本章重點,這裡我們只需知道編譯期 (Compile time) 早於執行期 (Run time) 。

因為時間早早就被凍結了,所以和純 val 不同,不能指定有屬性可變化的類別,只能指定基本型別 (Basic Types) 。 Kotlin 官網文件有列舉所有基本型別,有興趣的朋友可以查看。

const val 只能指定基本型別。

const val 只能指定基本型別。

const val 因為是固定的,所以連本來準備的彈性變動空間都省下來了,用專業的術語來說就是提高效能。對於開發者來說,可讀性也提高,知道這是寫死的變數,要重寫時會特別留意。

大家都知道翻譯總是很難表達原意,因此更理解程式語言特性,程式就能寫得更精準,電腦也越能理解我們要做的事。

共勉之。

avatar-img
Kate的沙龍
6會員
45內容數
和 Kotlin 相關的系列文章。 給程式初學者的「Kotlin 學習系列」 給正在實戰的工程師「Kotlin 實戰系列」
留言
avatar-img
留言分享你的想法!
Kate的沙龍 的其他內容
行程 (Process),正如其名,指的是正在執行的程式 (Program),變數在其之中,是獲得命名,能保留自我的少數特殊存在。如果變數屬於全域變數 (Global Value),那麼其生命週期就會和行程一致,其他較短生命週期的都是局部變數 (Local Value)。 從一而終,在生命中止前不變
接續上次的士兵類別,提到名字用了 String 變數。 String 是字串的意思,在 Kotlin 裡,常見變數可以分成幾個基本資料型別:數字(Number)、字串(String)、布林(Boolean)。 差別在於行為模式不同,以加法為例,數字執行數學課上的四則運算的加法,字串卻做了連接,布林則
作為指揮官,如果只有一個部下也太令人傷心了。 為能夠有效率的取得大量的士兵,使用類型(Type)來廉價批發。 建立一個檔案「士兵.kt」,這次選 class,讓 IDE 幫我們初始化類別的程式碼 。 建立一個檔案「士兵.kt」,選 class 。  IDE 預設將 class 取名和檔案一樣。 初級
程式是個單純的小伙子,他會按照程式碼的內容執行動作,所以我們可以把函數當作給他的指令「單位」,不是最小單位,就只是單位。 以下是令人熱血沸騰的情境: 「射擊準備!發射角度東偏南33度,目標距離200公尺,風向正西速度每小時100公里,氣溫38度,濕度百分之20。」 「yes, my master.」
現在,開始建立第一個檔案吧,一樣用最簡單的 Hello World 示範。 在 kotlin 資料夾按右鍵選擇 New 裡的 Kotlin File/Class 。 雖然有許多格式可以選,但其實只是 IDE 提供初始程式碼的差別,完全可以中途更改,我們這次選最基本的 File 格式就好。 命名檔案和
會撰寫 Hello World 程式,證明我們已經推開程式語言的大門,成為會寫這門語言的開發者,所以,現在就先來寫 Hello World 吧。 目標:印出 Hello World 這串文字。
行程 (Process),正如其名,指的是正在執行的程式 (Program),變數在其之中,是獲得命名,能保留自我的少數特殊存在。如果變數屬於全域變數 (Global Value),那麼其生命週期就會和行程一致,其他較短生命週期的都是局部變數 (Local Value)。 從一而終,在生命中止前不變
接續上次的士兵類別,提到名字用了 String 變數。 String 是字串的意思,在 Kotlin 裡,常見變數可以分成幾個基本資料型別:數字(Number)、字串(String)、布林(Boolean)。 差別在於行為模式不同,以加法為例,數字執行數學課上的四則運算的加法,字串卻做了連接,布林則
作為指揮官,如果只有一個部下也太令人傷心了。 為能夠有效率的取得大量的士兵,使用類型(Type)來廉價批發。 建立一個檔案「士兵.kt」,這次選 class,讓 IDE 幫我們初始化類別的程式碼 。 建立一個檔案「士兵.kt」,選 class 。  IDE 預設將 class 取名和檔案一樣。 初級
程式是個單純的小伙子,他會按照程式碼的內容執行動作,所以我們可以把函數當作給他的指令「單位」,不是最小單位,就只是單位。 以下是令人熱血沸騰的情境: 「射擊準備!發射角度東偏南33度,目標距離200公尺,風向正西速度每小時100公里,氣溫38度,濕度百分之20。」 「yes, my master.」
現在,開始建立第一個檔案吧,一樣用最簡單的 Hello World 示範。 在 kotlin 資料夾按右鍵選擇 New 裡的 Kotlin File/Class 。 雖然有許多格式可以選,但其實只是 IDE 提供初始程式碼的差別,完全可以中途更改,我們這次選最基本的 File 格式就好。 命名檔案和
會撰寫 Hello World 程式,證明我們已經推開程式語言的大門,成為會寫這門語言的開發者,所以,現在就先來寫 Hello World 吧。 目標:印出 Hello World 這串文字。