做者 / 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 和/或其附属公司的注册商标。