作者 / David Winer, Kotlin 产品经理
在去年 5 月的 I/O 开发者大会上,咱们正式发表 Kotlin 优先 (Kotlin First) 的这一重要理念,Kotlin 将成为 Android 开发者的首选语言。目前,在排名前 1,000 位的 Android 利用中,已有超过 60% 正在应用 Kotlin 进行开发。为什么 Kotlin 受到这么多开发者的青睐呢?这里就不得不提 Kotlin 在可空性方面的劣势了。Kotlin 将可空性间接交融到了类型零碎中,这意味着开发者在申明一个参数时,须要提前阐明该参数是否接收 null 值。本文将带您理解 Android 11 SDK 引入了哪些变更,以便在 API 中显示更多的可空性信息。此外,咱们还将介绍一些实用办法与技巧,帮忙您做好筹备,顺利应答 Kotlin 中的可空性问题。
浅谈 Kotlin 中的可空性
应用 Kotlin 编写代码时,您能够应用 问号操作符 来指明可空性:
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
public @Nullable String getCurrentName() {return currentName;}
增加 @Nullable 正文后,当您在 Kotlin 文件中应用 getCurrentName 的后果时,您必须先进行 null 值查看,能力对其解析援用,否则会触发 Android Studio 报错,而且 Kotlin 编译器也会在构建时抛出谬误。@NonNull 正文则恰好与之相同,如果一个办法标有 @NonNull 正文,Kotlin 编译器会将该办法返回的后果视为非空类型,并禁止您在之后的代码中把该后果设置为 null。
此外,Kotlin 编译器还能够辨认另外两个相似的正文: @RecentlyNullable 和 @RecentlyNonNull。这两个正文与 @Nullable 和 @NonNull 完全相同,惟一的区别在于它们会生成正告而非谬误 *。
\* 鉴于 Kotlin 正文解决的相干规定,目前在多数状况下,编译器仅对 @Nullable 援用报错,而对 @RecentlyNullable 援用不报错。
更多详情: https://youtrack.jetbrains.com/issue/KT-36867
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 和 / 或其从属公司的注册商标。