是否计划向 Java 添加经过类型检查的可空类型?
Are there plans to add type-checked nullable types to Java?
相对于 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?
在Objects
中有3 static methods class要求对象不为空抛出异常:
requireNonNull(T obj)
requireNonNull(T obj, String message)
requireNonNull(T obj, Supplier<String> messageSupplier)
不,Oracle 没有这样的计划。
Oracle 认为您可以使用第三方工具来执行此操作,例如 Checker Framework, NullAway,或内置于 IDE 中的支持,例如 IntelliJ 或 Eclipse。
Oracle 甚至不支持创建所有第三方工具都会使用的标准 @NonNull
注释。 Oracle let JSR 305,它会定义标准注释,过期并且没有恢复它。
就像@mernst 指出的那样,您可以使用Checker Framework。它会在编译时检查所有内容,您甚至可以添加自己的检查器。
相对于 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?
在Objects
中有3 static methods class要求对象不为空抛出异常:
requireNonNull(T obj)
requireNonNull(T obj, String message)
requireNonNull(T obj, Supplier<String> messageSupplier)
不,Oracle 没有这样的计划。
Oracle 认为您可以使用第三方工具来执行此操作,例如 Checker Framework, NullAway,或内置于 IDE 中的支持,例如 IntelliJ 或 Eclipse。
Oracle 甚至不支持创建所有第三方工具都会使用的标准 @NonNull
注释。 Oracle let JSR 305,它会定义标准注释,过期并且没有恢复它。
就像@mernst 指出的那样,您可以使用Checker Framework。它会在编译时检查所有内容,您甚至可以添加自己的检查器。