做者 / David Winer, Kotlin 產品經理html
在去年 5 月的 I/O 開發者大會上,咱們正式宣佈 Kotlin 優先 (Kotlin First) 的這一重要理念,Kotlin 將成爲 Android 開發者的首選語言。目前,在排名前 1,000 位的 Android 應用中,已有超過 60% 正在使用 Kotlin 進行開發。爲何 Kotlin 受到這麼多開發者的喜好呢?這裏就不得不提 Kotlin 在可空性方面的優點了。Kotlin 將可空性直接融合到了類型系統中,這意味着開發者在聲明一個參數時,須要提早說明該參數可否接納 null 值。本文將帶您瞭解 Android 11 SDK 引入了哪些變動,以便在 API 中顯示更多的可空性信息。此外,咱們還將介紹一些實用方法與技巧,幫助您作好準備,順利應對 Kotlin 中的可空性問題。編程
使用 Kotlin 編寫代碼時,您能夠使用 問號操做符 來指明可空性:安全
KOTLIN var x: Int = 1 x = null // compilation error var y: Int? = 1 y = null // okay
Kotlin 的這個特性可以讓您的代碼更安全。即便您隨後調用一個方法或試圖訪問 x 等非空變量屬性,也不會面臨空指針異常的風險。許多開發者向咱們反饋表示,自從有了該特性後,他們即可以把更多精力放在代碼設計上併爲用戶打造質量更高的應用。編程語言
若是我使用的 (Android) API 不是用 Kotlin 編寫的,該怎麼辦?不用擔憂,Kotlin 編譯器可以識別 Java 代碼的註釋,從而斷定方法返回的結果是否爲可空值,例如:性能
JAVA public @Nullable String getCurrentName() { return currentName; }
添加 @Nullable 註釋後,當您在 Kotlin 文件中使用 getCurrentName 的結果時,您必須先進行 null 值檢查,才能對其解析引用,不然會觸發 Android Studio 報錯,並且 Kotlin 編譯器也會在構建時拋出錯誤。@NonNull 註釋則剛好與之相反,若是一個方法標有 @NonNull 註釋,Kotlin 編譯器會將該方法返回的結果視爲非空類型,並禁止您在以後的代碼中把該結果設置爲 null。spa
此外,Kotlin 編譯器還能夠識別另外兩個相似的註釋: @RecentlyNullable 和 @RecentlyNonNull。這兩個註釋與 @Nullable 和 @NonNull 徹底相同,惟一的區別在於它們會生成警告而非錯誤*。設計
\* 鑑於 Kotlin 註釋處理的相關規則,目前在少數狀況下,編譯器僅對 @Nullable 引用報錯,而對 @RecentlyNullable 引用不報錯。
更多詳情: https://youtrack.jetbrains.com/issue/KT-36867
咱們在發佈 Android 11 開發者預覽版 的時候,邀請開發者們試用了最新的 Android 11 SDK。咱們升級了 SDK 中的部分註釋,將 @RecentlyNullable 和 @RecentlyNonNull 分別更改成 @Nullable 和 @NonNull (可空性違規行爲從觸發警告變爲致使錯誤)。此外,咱們也繼續爲 SDK 中不包含可空性信息的方法增長 @RecentlyNullable 和 @RecentlyNonNull 註釋。指針
若是您正在使用 Kotlin 編寫代碼,當您從 Android 10 升級至 Android 11 SDK 後,您可能會遇到一些新的編譯器警告,另外,以前的警告也可能會以錯誤形式出現。這是咱們特地引入的變動,也是 Kotlin 編譯器的特性之一。這些警告會提醒您當前代碼可能會致使應用崩潰 (若是您編寫的不是 Kotlin 代碼,您可能會徹底忽略這個風險)。您能夠經過在代碼中添加 空值檢查 來解決這些警告或報錯。code
咱們將繼續遵循如下原則爲 Android SDK 添加註釋: 先在較低版本 (例如 Android 10) 中採用 @RecentlyNullable 和 @RecentlyNonNull,而後再在新版本 (例如 Android 11) 中將其升級爲 @Nullable 和 @NonNull。此舉的目的是爲了給您預留至少一個版本發佈週期的時間更新 Kotlin 代碼,確保其質量更高、更加健壯。htm
\* Java 是 Oracle 和/或其附屬公司的註冊商標。