gpt4 book ai didi

java - 同时使用 @Nonnull 和 Preconditions.checkNotNull(...)

转载 作者:行者123 更新时间:2023-11-29 07:32:26 25 4
gpt4 key购买 nike

使用 @Nonnull 注释的参数然后使用 Preconditions.checkNotNull() 检查是否有意义?

它们有什么区别?据我所知,使用 @Nonnull 只会指定一个契约(Contract),但不会进一步检查,除非您在 IDE 中这样告诉它。这是正确的吗?

最佳答案

区别在于规范和实现。 @NonNull 给出了例程的规范,Preconditions.checkNotNull() 给出了一种验证例程的方法。

@NonNull 指定形式参数上的契约:永远不应使用 null 作为相应的实际参数来调用该方法。

有多种方法可以验证此类规范。

  • 您可以使用 assert 语句或等效的 Preconditions.checkNotNull() 执行运行时检查。这将在运行时动态地发现违反契约的行为,并使程序崩溃。这会通过提早发出警告消息使您的代码更易于调试,但不会提高代码质量。

  • 您可以使用 IDE 或其他工具在编译时执行静态检查。如果您使用声音工具,则可以保证任何可能的执行都不会违反规范并导致程序崩溃。

您需要对您的方法进行规范,以记录它应该如何使用。您最好使用 @NonNull 注释来编写,而不是像 Javadoc 那样使用英语,因为 @NonNull 简洁且机器可读。因此,您应该编写 @NonNull 注释。

验证规范的正确性是可选的,但很有用。同时使用运行时检查和静态检查进行验证是一种安全措施。它使用两种不同的技术来验证规范。如果您使用诸如 FindBugs 之类的静态检查工具,那么进行运行时检查是一个好主意,因为即使 FindBugs 不发出任何警告,您的代码中仍然可能存在空值错误。如果您使用声音工具,例如 Nullness CheckerChecker Framework ,那么运行时检查是无关紧要的。不过,它们并没有造成太大伤害:只是代码有点困惑和运行时开销有点大。

(请注意,如果将 null 值作为参数传递,规范可能会要求抛出特定异常。这将要求方法主体包含诸如 Preconditions.checkNotNull() 即使你已经证明你的程序永远不会传递 null。规定抛出的确切异常的规范对客户端代码并不是特别有用。客户端真的只想知道在什么情况下调用会成功,而客户端不太可能有专门针对 NullPointerExceptioncatch block 。因此,客户端在规范中需要的主要信息是 null 是非法值。)

关于java - 同时使用 @Nonnull 和 Preconditions.checkNotNull(...),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40130931/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com