31DaysOfKotlin - Day1—安全調用

學習總結

Kotlin處理空引用的風格/策略是在編譯期檢查出空引用的地方,如果檢測查出來便編譯失敗並提示,即在編譯階段就避免了空引用的調用。爲達完成這個目標,Kotilin提供一系列的語法規範去約束大家,同時幫助編譯器更好的去判斷是否使用用了空引用的同時,也使代碼更簡潔(減少出現對判空的代碼)。其中最核心的是變量定義的時候需要聲名變量是否可空,還是非可空(在變量類型後加?號),非可空就是不可以賦值爲null,非可空對於對於在編碼過程中可以不用判斷是否爲空。這樣下,一方面代碼簡潔了,另一方面編譯器判空的實現也簡單與容易了。變量可空時,Kotlin除了提供一系統的語法糖方便我們安全與優雅編寫判空的代碼,同時編譯器也會結合代碼的上下文,幫忙我們儘可以的減少非空的判斷操作。如下示例代碼就是編譯器根據上下文判斷引用的安全性

val b: String? = "Kotlin"
if (b != null && b.length > 0) { 
    print("String of length ${b.length}") // 編譯器已經根據判斷條件,確定b變量安全(非空)
} else {
    print("Empty string")
}

知識要點

區分語句與表達式

語句與表達式的最主要的區別是表達式是有值的,有值意味關可以賦值給變量!在學習Kotiln提供的語法糖時需要時刻關注該語法是個語句還是個表達式,這個非常重要,除了能深刻理解該語法,還能更理解加容易記憶與使用

注意,在 Kotlin 和 Java 中表述什麼是表達式以及什麼不是表達式時,兩者有基本的差別。所有的 Kotlin 函數調用都是表達式,因爲他們至少會返回 Unit。調用沒有定義任意返回值的 Java 函數時不是表達式。
Kotlin 中變量賦值(a = 1)不是表達式,但是在 Java 中則是,因爲這個操作之後會返回被賦予的值(在 Java 中,你可以 a = b = 2 或者 a = 2 * (b = 3)))。
在 Java 中所有的控制結構(if, switch) 都不是表達式,而在 Kotlin 中允許 if, when , try 返回值

定義可空變量

變量名 : 變量類型 //非可空
變量名 : 變量類型? //可空

安全調用

安全調用主要是指對於可空變量的使用,除了傳統的判空再使用,kotlin提供了額外的語法糖(?.)操作,需要注意該操作是一個表達式,如果操作的變量爲空,表達值示值結果是null,否則是實例的調用返回值

  • ?. 可以鏈式調用,中途某個變量/屬性爲空時中止調用,表達式求值爲null
  • ?. 可以結合let函數據使用,可以對非空對象執行一系列操作
  • 安全調用也可以出現在賦值的左側。這樣,如果調用鏈中的任何一個接收者爲空都會跳過賦值,而右側的表達式根本不會求值!!!
    代碼示例
val a = "Kotlin"
val b: String? = null
println(b?.length) //這裏控制檯爲輸出 null 

// 如果 `person` 或者 `person.department` 其中之一爲空,都不會調用該函數:
person?.department?.head = managersPool.getManager()
// 注?這個有點矛盾呀,這時候不會求值,但又還是表達式!!!

可空默認值

Elvis 操作符可以替換 當?.操作變量爲空時表達式的默認值(null)

val l: Int = if (b != null) b.length else -1
// elvis的寫法
val l = b?.length ?: -1

參考文檔

發佈了231 篇原創文章 · 獲贊 123 · 訪問量 67萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章