Java 同时使用@Nonnull和前提条件。checkNotNull(…)

Java 同时使用@Nonnull和前提条件。checkNotNull(…),java,null,annotations,guava,Java,Null,Annotations,Guava,用@Nonnull注释一个参数,然后用先决条件检查它是否有意义。checkNotNull() 他们之间有什么区别?据我所知,使用@Nonnull只会指定一个契约,但不会进一步检查,除非您在IDE中告诉它。这是否正确?规范和实现之间存在差异@NonNull给出了例程的规范,以及的先决条件。checkNotNull()给出了验证例程的一种方法 @NonNull指定形式参数上的约定:不应使用null作为对应的实际参数来调用该方法 有多种方法可以验证此类规范 您可以使用assert语句或等效的预条件执

@Nonnull
注释一个参数,然后用
先决条件检查它是否有意义。checkNotNull()


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

规范和实现之间存在差异
@NonNull
给出了例程的规范,以及
的先决条件。checkNotNull()
给出了验证例程的一种方法

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

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

  • 您可以使用
    assert
    语句或等效的
    预条件执行运行时检查。checkNotNull()
    。这将在运行时动态查找违反契约的情况,并使程序崩溃。这通过给出早期的警告消息使您的代码更容易调试,但这并不能提高代码质量

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

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

验证规范的正确性是可选的,但很有用。使用运行时检查和静态检查进行验证是一种安全带和吊杆方法。它使用两种不同的技术来验证规范。如果使用不健全的静态检查工具(如FindBugs),那么执行运行时检查是一个好主意,因为即使FindBugs没有发出任何警告,代码中也可能存在空值错误。如果使用声音工具(如的),则运行时检查是无关的。不过,它们不会造成太大的伤害:只是一点点代码混乱和一点点运行时开销

(请注意,如果将null值作为参数传递,则规范可能要求引发特定异常。这将要求方法体包含诸如
premissions.checkNotNull()之类的代码)
即使您已经证明您的程序从不通过null。指定引发的确切异常的规范对客户端代码并不特别有用。客户端只想知道调用在什么情况下会成功,并且客户端不太可能有专门用于
Nu的
catch
块llPointerException
。因此,客户机在规范中需要的主要信息是null是非法值。)