首頁>技術>

常量

Kotlin 中的常量使用 val 修改,一旦定義值後"不可再修改",常量型別分 2 種:

執行時常量(val):編譯期不能確定它的值,程式碼中會保留變數對它的引用。編譯期常量(const val):編譯期就知道值,並且會把程式碼中所有對它的引用都替換成它的值。

下面我們來舉例看看,這兩者在程式碼層面上的區別到底是什麼。

執行時常量(val)

這是一段很簡單的 Kotlin 程式碼,先定義一個常量 FINAL_NAME,再定義一個變數 myName 引用常量 FINAL_NAME:

val FINAL_NAME: String = "lqr"var myName = FINAL_NAME

透過 IDEA 自帶的 Show Kotlin Bytecode 工具將 Kotlin 程式碼轉換成二進位制,再反編譯成 Java 程式碼:

@NotNullprivate static final String FINAL_NAME = "lqr";@NotNullprivate static String myName;...static {    myName = FINAL_NAME;}

結論:Kotlin 中變數對 val常量 的引用,會轉變成 java 語言在 static 程式碼塊中的賦值語句,即變數在編譯期只保留了 val常量 的引用。

Show Kotlin Bytecode 工具所在路徑:Tools -> Kotlin -> Show Kotlin Bytecode

編譯期常量(const val)

跟上面一樣,先定義一個常量 FINAL_CONST_NAME,再定義一個變數 myConstName 引用常量 FINAL_CONST_NAME:

const val FINAL_CONST_NAME: String = "lqr"var myConstName = FINAL_CONST_NAME

透過 IDEA 自帶的 Show Kotlin Bytecode 工具將 Kotlin 程式碼轉換成二進位制,再反編譯成 Java 程式碼:

@NotNullpublic static final String FINAL_CONST_NAME = "lqr";@NotNullprivate static String myConstName = "lqr";

結論:Kotlin 中變數對 const val常量 的引用,會轉變成直接賦值語句,即編譯期會把程式碼中所有對 const val常量 的引用都替換成它的值。

Kotlin 中 val常量 僅僅只是類似 Java 中的 final 常量而已,而 const val 常量,才是真正對應 Java 中的 final 常量。因為 Java 中的 final 常量是編譯期常量。

變數

與常量不同,變數是後續可修改的,Kotlin 中使用 var 定義:

var myName: String = "lqr"myName = "吳彥祖"

那如果對 val常量 再執行賦值操作會怎樣呢?

val FINAL_NAME: String = "lqr"FINAL_NAME = "吳彥祖" // 報錯:Val cannot be reassigned

val常量 如此,const val常量 也是一樣的,就不多廢話了。

型別推導

Kotlin 支援型別推導,當常量或變數在定義並且賦值時,Kotlin 就已經明確了該常量或變數的型別,於是常量或變數的型別可省略:

val string = "Hello" // 推匯出 String 型別val int = 5 // Int 型別var x = getString() + 5 // String 型別

注意:Kotlin 是支援型別推導的強型別語言,不同於 python、js 中的動態型別,Kotlin 中一旦確定了變數型別,後續將不可修改。

10
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 如何在 ASP.Net Core 中實現 資料保護API