Java检查非null值有必要同时使用@NonNull和Objects.requireNonNull()吗
Java的@NonNull和Objects.requireNonNull()常常会被用来限制值为非null值,它们有什么不同呢?
@NonNull
在引入@NonNull之前,我们要求使用非null值时,往往需要在javadoc里做说明。编译器是没有办法对javadoc进行干预。使用注解类型@NonNull后,编译器就可以在编译时对代码做检查。这也有利于一些ide根据注解类型,对null值的代码给出提示。
@NonNull更多的是用于编译时对代码做校验。
Objects.requireNonNull()
Objects.requireNonNull()则是在运行时对对象做非null检查。如果对象为null值,则抛出NullPointException。
在java文档里有这样的建议:
Optional Type Annotations are not a substitute for runtime validation
Before Type Annotations, the primary location for describing things like nullability or ranges was in the javadoc. With Type annotations, this communication comes into the bytecode in a way for compile-time verification.
Your code should still perform runtime validation.
它的意思是说注解类型是提供进入字节码在编译时做校验的方式,但不能用作代替运行时的校验。
总结
@NonNull和Objects.requireNonNull()应该说是相互补充,分别提供了编译时和运行时对代码做非null检查的方式。所以在做非null值检查时是可以同时使用。