在 Android 11 及更高版本系統中處理可空性 [復制鏈接]

2020-4-16 16:14
_luhua_ 閱讀:1377 評論:0 贊:1
Tag:  

在去年 5 月的 I/O 開發者大會上,我們正式宣布 Kotlin 優先 (Kotlin First) 的這一重要理念,Kotlin 將成為 Android 開發者的首選語言。目前,在排名前 1,000 位的 Android 應用中,已有超過 60% 正在使用 Kotlin 進行開發。為什么 Kotlin 受到這么多開發者的喜愛呢?這里就不得不提 Kotlin 在可空性方面的優勢了。Kotlin 將可空性直接融合到了類型系統中,這意味著開發者在聲明一個參數時,需要提前說明該參數能否接納 null 值。本文將帶您了解 Android 11 SDK 引入了哪些變更,以便在 API 中顯示更多的可空性信息。此外,我們還將介紹一些實用方法與技巧,幫助您做好準備,順利應對 Kotlin 中的可空性問題。

淺談 Kotlin 中的可空性

使用 Kotlin 編寫代碼時,您可以使用問號操作符來指明可空性:

[代碼]java代碼:

KOTLIN

var x: Int = 1
x = null // compilation error

var y: Int? = 1
y = null // okay

Kotlin 的這個特性能夠讓您的代碼更安全。即使您隨后調用一個方法或試圖訪問 x 等非空變量屬性,也不會面臨空指針異常的風險。許多開發者向我們反饋表示,自從有了該特性后,他們便可以把更多精力放在代碼設計上并為用戶打造質量更高的應用。

可空性對 Java 編程語言有什么作用?

如果我使用的 (Android) API 不是用 Kotlin 編寫的,該怎么辦?不用擔心,Kotlin 編譯器能夠識別 Java 代碼的注釋,從而判定方法返回的結果是否為可空值,例如:

[代碼]java代碼:

JAVA

public @Nullable String getCurrentName() {
   return currentName;
}

添加 @Nullable 注釋后,當您在 Kotlin 文件中使用 getCurrentName 的結果時,您必須先進行 null 值檢查,才能對其解析引用,否則會觸發 Android Studio 報錯,而且 Kotlin 編譯器也會在構建時拋出錯誤。@NonNull 注釋則恰好與之相反,如果一個方法標有 @NonNull 注釋,Kotlin 編譯器會將該方法返回的結果視為非空類型,并禁止您在之后的代碼中把該結果設置為 null。

此外,Kotlin 編譯器還可以識別另外兩個類似的注釋: @RecentlyNullable 和 @RecentlyNonNull。這兩個注釋與 @Nullable 和 @NonNull 完全相同,唯一的區別在于它們會生成警告而非錯誤*。

Android 11 中的可空性

我們在近期發布了 Android 11 開發者預覽版,邀請開發者們試用最新的 Android 11 SDK。我們升級了 SDK 中的部分注釋,將 @RecentlyNullable 和 @RecentlyNonNull 分別更改為 @Nullable 和 @NonNull (可空性違規行為從觸發警告變為導致錯誤)。此外,我們也繼續為 SDK 中不包含可空性信息的方法增加 @RecentlyNullable 和 @RecentlyNonNull 注釋。

下一步

如果您正在使用 Kotlin 編寫代碼,當您從 Android 10 升級至 Android 11 SDK 后,您可能會遇到一些新的編譯器警告,另外,之前的警告也可能會以錯誤形式出現。這是我們特意引入的變更,也是 Kotlin 編譯器的特性之一。這些警告會提醒您當前代碼可能會導致應用崩潰 (如果您編寫的不是 Kotlin 代碼,您可能會完全忽略這個風險)。您可以通過在代碼中添加空值檢查來解決這些警告或報錯。

我們將繼續遵循以下原則為 Android SDK 添加注釋: 先在較低版本 (例如 Android 10) 中采用 @RecentlyNullable 和 @RecentlyNonNull,然后再在新版本 (例如 Android 11) 中將其升級為 @Nullable 和 @NonNull。此舉的目的是為了給您預留至少一個版本發布周期的時間更新 Kotlin 代碼,確保其質量更高、更加健壯。

  • Java 是 Oracle 和/或其附屬公司的注冊商標



作者:谷歌開發者
鏈接:https://www.jianshu.com/p/cebf56020f26
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

我來說兩句
您需要登錄后才可以評論 登錄 | 立即注冊
facelist
所有評論(0)
領先的中文移動開發者社區
18620764416
7*24全天服務
意見反饋:[email protected]

掃一掃關注我們

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粵ICP備15117877號 )

时时彩改欢乐生肖 彩票幸运快3全天实时计划网 中芯国际股票代码 吉林快一定牛走势图 陕西体彩11选5手机版 青海快三开奖结果一定牛 官方中国福利彩票下载 浙江体彩20选5 辽宁11选5推荐码 涵星配资 三分赛车是统一开奖吗 青海快三有没有平台有 富盈门财富 福彩安徽快三走势图 广西8日3日快3开 吉林新11选5手机板 股票资配?