Reactor - 对 Kotlin 的支持
# 简介
Kotlin (opens new window) 是一种运行于 JVM(及其他平台)上的静态(statically-typed)语言。 使用它可以在拥有与现有 Java 库良好 互操作性 (opens new window) 的同时编写简介优雅的代码。
本内容介绍了 Reactor 3.1 如何能够完美支持 Kotlin。
# 前提
Kotlin 支持 Kotlin 1.1+ 及依赖 kotlin-stdlib
(opens new window) (或 kotlin-stdlib-jre7
(opens new window) / kotlin-stdlib-jre8
(opens new window) 之一)
# 扩展
多亏了其良好的 Java 互操作性 (opens new window) 以及 Kotlin 扩展(extensions) (opens new window), Reactor Kotlin APIs 既可使用 Java APIs,还能够收益于一些 Reactor 内置的专门支持 Kotlin 的 APIs。
注意 Kotlin 的扩展需要 import 才能够使用。所以比如
Throwable.toFlux
的 Kotlin 扩展必须在import reactor.core.publisher.toFlux
后才可使用。多数场景下 IDE 应该能够自动给出这种类似 static import 的建议。
例如,Kotlin 参数类型推导(reified type parameters) (opens new window) 对于 JVM 的 通用类型擦除(generics type erasure) (opens new window)提供了一种变通解决方案,Reactor 就可以通过扩展(extension)来应用到这种特性。
下面是对「Reactor with Java」和「Reactor with Kotlin + extensions」的比较:
Java | Kotlin + extensions |
---|---|
Mono.just("foo") | "foo".toMono() |
Flux.fromIterable(list) | list.toFlux() |
Mono.error(new RuntimeException()) | RuntimeException().toMono() |
Flux.error(new RuntimeException()) | RuntimeException().toFlux() |
flux.ofType(Foo.class) | flux.ofType<Foo>() or flux.ofType(Foo::class) |
StepVerifier.create(flux).verifyComplete() | flux.test().verifyComplete() |
可参考 Reactor KDoc API (opens new window) 中详细的关于 Kotlin 扩展的文档。
# Null 值安全
Kotlin的一个关键特性就是 null 值安全 (opens new window) ——从而可以在编译时处理 null
值,而不是在运行时抛出著名的 NullPointerException
。 这样,通过「可能为空(nullability)」的声明,以及能够表明「有值或空值」的语法(避免使用类似 Optional
来进行包装),使得应用程序更加安全。(Kotlin允许在函数参数中使用可能为空的值, 请参考 comprehensive guide to Kotlin null-safety (opens new window))
尽管 Java 的类型系统不允许这样的 null 值安全的表达方式, Reactor 空值安全 对所有 Reactor API 通过工具友好的(tooling-friendly)注解(在 reactor.util.annotation
包中定义)来支持。 默认情况下,Java APIs 用于 Kotlin 的话会被作为 平台类型(platform types) (opens new window) 而放松对 null 的检查。 Kotlin 对 JSR 305 注解的支持 (opens new window) + Reactor 可为空(nullability)的注解,为所有 Reactor API 和 Kotlin 开发者确保「null 值安全」的特性 (在编译期处理 null 值)。
JSR 305 的检查可以通过增加 -Xjsr305
编译参数进行配置:-Xjsr305={strict|warn|ignore}
。
对于 kotlin 1.1.50+,默认的配置为 -Xjsr305=warn
。如果希望 Reactor API 能够全面支持 null 值安全 则需要配置为 strict
。不过你可以认为这是实验性的(experimental),因为 Reactor API 「可能为空」 的声明可能甚至在小版本的发布中都会不断改进,而且将来也可能增加新的检查。
目前尚不支持通用类型参数、可变类型以及数组元素的「可为空」。不过应该包含在接下来的发布中,最新信息请看 这个 Issues (opens new window)。