jar305.jar中的注释是否应优先于FindBugs的annotation.jar中的类似注释?

在FindBugs发行版中, annotations.jar 不是 jsr305.jar的子集。 但是,几个注释似乎是重复的(要么完全或非常密切)。 如果我有选择,我应该更喜欢jsr305.jar的注释吗?

请注意,我不仅仅想知道使用jsr305.jar注释会“更好”,因为它们代表了一个标准。 相反,我想知道如果我更喜欢特定注释的jsr305.jar版本,FindBugs工具是否会执行相同(或更好)的分析。 可能是某些jsr305.jar注释应该是首选,但其他人不应该这样。

我正在使用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.NullnessAnnotationNullnessAnnotationDatabase类,以获取内部完成此操作的初始视图。 看看这个包,你会发现类似其他注释的类,比如jcip。

所以从实现的角度来看它确实没关系。 对于每个人仍然不确定使用哪个注释我会考虑使用标准注释或自定义注释来避免它们的代码依赖于findbugs库。