@NotNull和@Nullable,与Java注释矛盾

ibe*_*beu 1 java annotations nullable

我偶然发现我不小心这样做了:

@javax.annotation.Nullable
@javax.validation.constraints.NotNull
Run Code Online (Sandbox Code Playgroud)

编译器没有抱怨,一切似乎都很好。

现在,我想知道当两个或更多注释相互矛盾时内部发生了什么。此外,顺序重要吗?

这是

@Nullable
@NotNull
Run Code Online (Sandbox Code Playgroud)

比这一样吗?

@NotNull
@Nullable
Run Code Online (Sandbox Code Playgroud)

一般来说,这对注释如何起作用?谁赢?

编辑:我正在寻找一个一般性的答案,不一定关于这两个注释

Vla*_*sev 5

注释本身不会给您的代码带来任何逻辑。每个注释都应使用适当的注释处理器进行处理。注释处理器是使注释有意义的人。

查看官方教程

注释是元数据的一种形式,它提供有关程序的数据,该数据不属于程序本身。注释对其注释的代码的操作没有直接影响。

注释有多种用途,其中包括:

  • 供编译器使用的信息 - 编译器可以使用注释来检测错误或禁止显示警告。
  • 编译时和部署时处理 -软件工具可以处理注释信息以生成代码,XML文件等。
  • 运行时处理 -在运行时可以检查一些注释。

让我们考虑一下您上面提到的这两个特殊注释。首先,它们不是互斥的并且具有不同的性质。

@javax.annotation.Nullable是其中一部分JSR-305,它有相对的一个- @javax.annotation.Nonnull。这些注释旨在注释您的类字段,方法参数和方法结果。您可以将它们与代码分析器一起使用,其中之一是Findbugs

@javax.validation.constraints.NotNullJSR-303 aka Bean验证的一部分。因此,此注释与并无共同之处@javax.annotation.Nullable,因为这些注释具有不同的处理器。

每次对注释语义有疑问时,都应检查文档,当然您可以运行代码,看看会发生什么。