代码之家  ›  专栏  ›  技术社区  ›  prime

@Nonnull和Objects之间的区别是什么。要求不完整

  •  19
  • prime  · 技术社区  · 8 年前

    以下两段代码之间的区别是什么。

    public Integer getId(@Nonnull SomeObject obj){  
        // do some stuff
        return id;
    }
    
    public Integer getId(SomeObject obj){   
        Objects.requireNonNull(SomeObject, "SomeObject is null");
        // do some stuff
        return id;
    }
    

    它们之间的显著差异是什么。在这些情况下,执行空检查的正确方法是什么。

    3 回复  |  直到 8 年前
        1
  •  21
  •   Community Mohan Dere    6 年前

    两者相辅相成: @Nonnull 注释记录了以下事实: obj 必须为非null,而 Objects.requireNonNull 通话确保 obj公司 在运行时为非null。

    您应该将两者结合起来,如下所示:

    public Integer getId(@Nonnull SomeObject obj){   
        Objects.requireNonNull(SomeObject, "SomeObject is null");
        // do some stuff
        return id;
    }
    

    相关文件 @非Null 可以找到 here :

    可选类型注释不能替代运行时验证

    在类型注释之前,描述nullability或ranges等内容的主要位置是在javadoc中。对于类型注释,这种通信以编译时验证的方式进入字节码。

    您的代码仍应执行运行时验证。

        2
  •  8
  •   ledniov    8 年前

    不同之处在于,在第一种情况下,它提示编译器和IDE参数不应为null,因此当您编写 getId(null) 你会得到一个错误。但有人可能会通过 null 运行时中的值。

    至于第二种情况,这是一种防御性编程,当您快速失败时,前提是参数不应 无效的 .

        3
  •  5
  •   Makoto    8 年前

    其中之一是实现 JSR-305 ,但更多的是用于静态分析,而不是用于运行时保护。我记得,JSR-305在原则上是一个好主意,很多东西实际上在某种程度上利用了它,但当它的效用仅以静态分析的形式出现时,它就失去了很多优势。

    举个例子:您的IDE可以利用它来警告您正在传递不应该传递的内容,但它不能阻止您传递 null 在编译时输入此方法。

    Objects.requireNonNull 是一个 运行时强制 传递的任何内容都将是非null引用。编译器也不能强制执行此操作,但在运行时,如果您收到空值,您将得到 NullPointerException 在执行该行代码时。

    在正确性方面,使用 物体。要求不完整 这是一个好主意,但这取决于您在运行应用程序时的义务。如果你 必须 在null值上失败,然后使用它就可以了,因为它将生成一个要处理的运行时异常。如果你 不能 在null值上失败,然后使用 if 相反,检查会更好。