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

Gre*_*tes 12 java annotations static-analysis findbugs

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

Ste*_*fen 9

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

据我所知,通过查看源代码,findbugs在内部使用相同的分析方法.调度仅基于注释名称完成.如上面链接的博客文章中所述,请查看edu.umd.cs.findbugs.ba.NullnessAnnotationNullnessAnnotationDatabase类,以获取内部完成此操作的初始视图.看看这个包,你会发现其他注释类似于jcip的类.

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