对于FindBugs,应优先选择jar3​​05.jar中的注释而不是注解中的类似注释吗?

问题描述

| 在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库。