相对于Java,我最喜欢Kotlin的一点是,您可以使用编译器来保证某些值永远不会为null。(Swift也有这个功能。(
var foo: Thing
var bar: Thing?
就是这个例子,foo
永远不能为空。我不必用防御性的空检查来污染我的代码。另一方面,bar
可能为空。还有一种方便的语法用于检查某个东西是否为null并使用它
bar?.x // bar.x, or null if bar is null
bar ?: defaultBar // bar, or defaultBar if bar is null
if (bar != null) {
// bar is now Thing here, not Thing? (Assuming bar is a parameter or local variable.)
}
Java最近发展得更快,并添加了一些功能,但我还没有听说过这方面的任何消息。它被考虑过并被拒绝了吗?或者有一天它会被添加到Java中?
Oracle认为您可以使用第三方工具来做到这一点,例如Checker Framework、NullAway,或者内置在IDE中的支持,例如IntelliJ或Eclipse。
Oracle甚至不支持创建所有第三方工具都会使用的标准@NonNull
注释。Oracle让JSR305过期,它本来可以定义标准注释,但没有恢复
Objects
类中有3个静态方法用于要求对象不为null并在为null时抛出异常:
requireNonNull(T obj)
requireNonNull(T obj, String message)
requireNonNull(T obj, Supplier<String> messageSupplier)
正如@mernst所指出的,您可以使用Checker框架。它在编译时检查所有内容,您甚至可以添加自己的检查器。