问题描述
|
在FindBugs分布中,
annotations.jar
不是jsr305.jar
的子集。但是,几个注释似乎重复了(精确地或非常接近地)。如果可以选择的话,我应该在jsr305.jar
中选择注释吗?
请注意,我不只是想知道,使用jsr305.jar
中的注释会“更好”,仅仅是因为它们表示一个标准。相反,我想知道如果我更喜欢特定批注的jsr305.jar
版本,FindBugs工具是否会执行相同(或更佳)的分析。在某些情况下,应优先使用某些“ 1”注释,而不应采用某些注释。
我正在使用FindBugs 1.3.9,它是撰写本文时的最新版本。使用此版本,我看到以下选择(如果还有其他选择,请更新此表):
edu.umd.cs.findbugs.annotations.CheckForNull→javax.annotation.CheckForNull
edu.umd.cs.findbugs.annotations.CheckReturnValue→javax.annotation.CheckReturnValue
edu.umd.cs.findbugs.annotations.NonNull→javax.annotation.Nonnull(NB大写)
edu.umd.cs.findbugs.annotations.Nullable→javax.annotation.Nullable
edu.umd.cs.findbugs.Annotations.When→javax.annotation.Meta.When
而且,所有的JCIP注释都是重复的:
net.jcip.annotations.GuardedBy→javax.annotation.concurrent.GuardedBy
net.jcip.annotations.Immutable→javax.annotation.concurrent.Immutable
net.jcip.annotations.NotthreadSafe→javax.annotation.concurrent.NotthreadSafe
net.jcip.annotations.ThreadSafe→javax.annotation.concurrent.ThreadSafe
解决方法
是的,如果可能的话,您应该首选JSR305批注。为什么?由于JSR305是标准,因此在可能的情况下遵守该标准是很有意义的。在移植我自己的应用程序时,我没有发现任何问题或行为改变。而且,您甚至可以定义自己的@NotNull批注,并且findbugs会选择它(只要您将其命名为NotNull),请参阅此博客条目以了解更多详细信息。
据查看源代码所见,findbugs在内部使用相同的分析方法。仅基于注释名称进行分派。如上面链接的博客文章所述,请查看edu.umd.cs.findbugs.ba.NullnessAnnotation和NullnessAnnotationDatabase类,以初步了解如何在内部完成此操作。看看这个包,您会发现其他注释(例如jcip注释)的类似类。
因此,从实现的角度来看,这并不重要。对于每个仍然不确定要使用哪个批注的人,我会考虑使用标准批注或自定义批注,以避免其代码依赖于findbugs库。