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

FindBugs 发行版中,不是 的子集。但是,一些注释似乎是重复的(完全或非常接近)。如果我有选择,我应该更喜欢注释吗?annotations.jarjsr305.jarjsr305.jar

请注意,我不只是想知道仅仅因为注释代表标准而使用注释会“更好”。相反,我想知道如果我更喜欢特定注释的版本,FindBugs工具是否会执行相同(或更好)的分析。可能的情况是,某些注释应优先,但其他注释则不应。jsr305.jarjsr305.jarjsr305.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 capitalization)
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


答案 1

是的,如果可能的话,您应该更喜欢JSR305注释。为什么?因为 JSR305 是一个标准,在可能的情况下坚持这些标准是完全有意义的。在移植我自己的应用程序时,我没有注意到任何问题或行为变化。此外,您甚至可以定义自己的@NotNull注释,findbugs会将其拾取(只要您将其命名为NotNull)请参阅此博客文章以获取更多详细信息

据我所知,通过查看来源,findbugs在内部使用相同的分析方法。调度仅基于注释名称完成。如上面链接的博客文章中提到的,请查看edu.umd.cs.findbugs.ba.NullnessAnnotationNullnessAnnotationDatabase类,以初步了解这是如何在内部完成的。看看这个包,你会发现其他注释的类似类,如jcip。

因此,从实现的角度来看,这真的无关紧要。对于仍然不确定使用哪些注释的每个人,我会考虑使用标准注释或自定义注释,以避免他们的代码依赖于findbugs库。


答案 2

推荐