2016-07-04 89 views
0

它发生在我身上,我无意这样做:@NotNull和@Nullable,矛盾Java注释

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

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

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

这是

@Nullable 
@NotNull 

比这一样吗?

@NotNull 
@Nullable 

这是如何工作的一般注释?谁赢?

编辑:我在寻找一个笼统的回答,不一定是关于这两个注解

+0

请您发布这些注释的完整限定名称。你的意思是'javax.validation'注释吗? –

回答

4

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

检查official tutorial

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

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

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

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

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

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

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

2

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

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