「Kotlin系列」Kotlin空安全-Java程序員都應該瞭解的新特性

寫在前面

「Kotlin系列」Kotlin空安全-Java程序員都應該瞭解的新特性

Java中的空指針異常

對於每個Java開發人員,上面的這個異常應該都不會陌生,空指針異常是Java裡面最常見也最頻繁出現的一個異常,因此在Java中經常會出現判斷是否為null的代碼,對此我們不勝其煩,Kotlin的出現讓人眼前一亮,其中就包括它的空安全特性。

空安全

在Kotlin中,類型系統將可空類型和不可空類型進行了區分,例如,聲明一個字符串變量時String為不可空類型,String?則為可空類型,如果將不可空類型賦值為null將會編譯不通過。

「Kotlin系列」Kotlin空安全-Java程序員都應該瞭解的新特性

對於不可空類型,可以直接調用它的成員變量或者函數,但是對於可空類型,直接調用成員變量或者函數將會編譯不通過,相當於直接在語法層面做出了限制。例如像上面的代碼中要執行 name.length 會編譯不通過,上面這些特性就是Kotlin中的空安全,它最大限度的避免了空指針異常的出現。

空值處理

既然空值不能直接調用它的成員變量或者函數,那正確的處理方式是什麼樣的呢?

1、和Java一樣進行null判斷

「Kotlin系列」Kotlin空安全-Java程序員都應該瞭解的新特性

name的值不為空則返回長度否則返回-1,並且這裡直接可以把if-else作為一個表達式返回給一個變量,這也體現出Kotlin語法比較靈活。

2、Kotlin的空安全檢查

「Kotlin系列」Kotlin空安全-Java程序員都應該瞭解的新特性

使用?.來調用成員變量或者函數,它會進行空安全檢查,只有在安全的情況下才會執行,否則返回null,另外這裡使用了Kotlin的三元運算符 ?: 整個代碼運行邏輯就是不為空返回變量的長度,否則返回-1

3、忽略空安全-拋出異常

「Kotlin系列」Kotlin空安全-Java程序員都應該瞭解的新特性

!!.是用來忽略空安全檢查的,不管是否為空都會執行,當為空的時候則會拋出空指針異常,但是,Kotlin並不建議在代碼中廣泛使用!!操作符,因為這樣會浪費Kotlin良好的非空類型的設計,讓Kotlin代碼中充斥著NPE。

下面總結一下,對於可空引用,如果希望調用它的成員變量或者成員函數,直接調用會出現編譯錯誤,有三種方式處理

  1. 在調用前,通過if-else進行空判斷;
  2. 使用 ?. 的形式調用,如果為null,返回null,否則返回對應的值;
  3. 使用 !!. 的形式調用,如果為null,拋出空指針異常,否則返回對應的值;

原理

Kotlin具備空安全的特性,到底用了什麼黑科技呢,其實看下源碼並沒什麼高深的東西;

「Kotlin系列」Kotlin空安全-Java程序員都應該瞭解的新特性

上面的代碼中定義了一個參數不可為空的函數,它在編譯的時候會編譯成下面的Java代碼,可以看見,首先參數添加了NotNull的註解,同時調用了checkParameterIsNotNull這個檢查空的函數,為空則會拋出IllegalArgumentException異常。

「Kotlin系列」Kotlin空安全-Java程序員都應該瞭解的新特性

喜歡就關注我,每天更新前後端開發相關的資料。


分享到:


相關文章: