【发布时间】:2014-04-24 10:36:00
【问题描述】:
是否可以在 Java 中创建不可为空的类型?这种类型的对象不能为空。怎么样?
【问题讨论】:
-
不,这是不可能的。
-
现在很有可能使用注释
是否可以在 Java 中创建不可为空的类型?这种类型的对象不能为空。怎么样?
【问题讨论】:
使用 @NotNull 注释是一种相当普遍的做法,某些 IDE 和 maven 插件支持该注释。在 Java 8 中,您可以编写
@NotNull String text;
@NotNull List<@NotNull String> strings = ...;
这不是语言功能,但如果您需要,可以使用。
注意:没有标准的 @NotNull 注释 :( 所以支持这个的工具允许你配置你想要的。我使用 IntelliJ 附带的那个。它在编辑器中给你警告具有自动修复功能并为 null 参数、返回值和变量添加运行时检查。
注意:IntelliJ 能够判断一个字段是否也不能通过使用为空。
【讨论】:
我最近遇到了Checker Framework,它有一个checker for null。
@Nullable 表示包含空值的类型。例如,布尔类型可以为空:布尔类型的变量始终具有 TRUE、FALSE 或 null 值之一。
@NonNull 表示不包含空值的类型。 boolean 类型是非空的; boolean 类型的变量始终具有值 true 或 false 之一。 @NonNull Boolean 类型也是非空的:@NonNull Boolean 类型的变量始终具有值 TRUE 或 FALSE 之一 — 从不为空。取消引用非空类型的表达式永远不会导致空指针异常。
@PolyNull 表示限定词多态性。有关@PolyNull 的描述,请参阅第 19.2 节。
@MonotonicNonNull 表示一个可能为 null 的引用,但如果它变成非 null,则它永远不会再次变为 null。这适用于延迟初始化的字段以及其他用途。读取变量时,其类型被视为@Nullable,而变量赋值时,其类型被视为@NonNull。
我还没来得及尝试。
【讨论】:
在纯 Java 中无法做到这一点。 Java 中的null 是对特定对象的引用的字面值。
由于 Java 中的所有对象都是引用类型,因此不允许使用 null 在语法上没有意义。
【讨论】:
你不能那样做。这是一种语言特性。你最多可以做的是空检查。
【讨论】:
您不能在纯 java 中执行此操作,但注释 @nonnull 将告诉编译器测试对象被分配空值的可能路径。然后它会引发构建错误,要求您修复具有空值的对象。
【讨论】: