【问题标题】:Make non-nullable type in Java在 Java 中创建不可为空的类型
【发布时间】:2014-04-24 10:36:00
【问题描述】:

是否可以在 Java 中创建不可为空的类型?这种类型的对象不能为空。怎么样?

【问题讨论】:

  • 不,这是不可能的。
  • 现在很有可能使用注释

标签: java null nullable


【解决方案1】:

使用 @NotNull 注释是一种相当普遍的做法,某些 IDE 和 maven 插件支持该注释。在 Java 8 中,您可以编写

@NotNull String text;
@NotNull List<@NotNull String> strings = ...;

这不是语言功能,但如果您需要,可以使用。

注意:没有标准的 @NotNull 注释 :( 所以支持这个的工具允许你配置你想要的。我使用 IntelliJ 附带的那个。它在编辑器中给你警告具有自动修复功能并为 null 参数、返回值和变量添加运行时检查。

注意:IntelliJ 能够判断一个字段是否也不能通过使用为空。

【讨论】:

  • 也许,您应该添加一些关于这样做的结果的信息。
  • @Bathsheba 是吗?作者没有提到,为什么要添加这个符号。当然,它不会使您免于将 null 传递给方法,也没有编译时/运行时验证。我认为,答案应该包含解释,这个注释是为了一些代码检查。
  • @ginz 在编辑器中编写代码时会进行验证,并在运行时验证时进行代码注入。你是对的,没有编译时验证。
【解决方案2】:

我最近遇到了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。

我还没来得及尝试。

【讨论】:

    【解决方案3】:

    在纯 Java 中无法做到这一点。 Java 中的null 是对特定对象的引用的字面值。

    由于 Java 中的所有对象都是引用类型,因此不允许使用 null 在语法上没有意义。

    【讨论】:

    • 在语法上确实有意义,该限制不会改变 Core Java 的语法。如果我想坚持使用空对象模式,这是一个可行的设计决策,实际上可以向 Tony Hoare 询问他的“百万美元错误”
    【解决方案4】:

    你不能那样做。这是一种语言特性。你最多可以做的是空检查。

    【讨论】:

      【解决方案5】:

      您不能在纯 java 中执行此操作,但注释 @nonnull 将告诉编译器测试对象被分配空值的可能路径。然后它会引发构建错误,要求您修复具有空值的对象。

      【讨论】:

        猜你喜欢
        • 2011-09-15
        • 2015-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多