賦值 (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 只能寫在最頂層或是物件,因為這兩者也是編譯時決定。
編譯 (Compile) 就是把我們寫的高階語言翻譯成電腦可以理解的機器語言,如果要細述過程會花太多時間,也不是本章重點,這裡我們只需知道編譯期 (Compile time) 早於執行期 (Run time) 。
因為時間早早就被凍結了,所以和純 val 不同,不能指定有屬性可變化的類別,只能指定基本型別 (Basic Types) 。
Kotlin 官網文件有列舉所有基本型別,有興趣的朋友可以查看。
const val 因為是固定的,所以連本來準備的彈性變動空間都省下來了,用專業的術語來說就是提高效能。對於開發者來說,可讀性也提高,知道這是寫死的變數,要重寫時會特別留意。
大家都知道翻譯總是很難表達原意,因此更理解程式語言特性,程式就能寫得更精準,電腦也越能理解我們要做的事。
共勉之。