@NotNull和@Nullable,与java注释相矛盾

时间:2016-07-04 12:51:25

标签: java annotations

我偶然发现了这件事:

@javax.annotation.Nullable
@javax.validation.constraints.NotNull

编译器没有抱怨,一切似乎都运行良好。

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

这是

@Nullable
@NotNull

与此相同?

@NotNull
@Nullable

这一般如何适用于注释?谁赢了?

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

2 个答案:

答案 0 :(得分:4)

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

检查official tutorial

  

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

     

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

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

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

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

@javax.validation.constraints.NotNullJSR-303 aka Bean Validation的一部分。因此,这个注释与@javax.annotation.Nullable没有任何共同之处,因为这些注释具有不同的处理器。

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

答案 1 :(得分:2)

注释不会改变程序的含义。 Java编译器将它们添加到程序的内部表示中(在编译期间,或者保存在类文件中,甚至在运行时),但是否则忽略它们。特别是,它不知道“冲突”注释。

注释由外部工具或库使用,它们可以以任何他们想要的方式处理冲突的注释(例如,通过打印错误消息)。