Должны ли аннотации в jar305.jar быть предпочтительными по сравнению с аналогичными аннотациями в аннотации. Jar для FindBugs?

В FindBugs распределение annotations.jar не является подмножеством jsr305.jar. Однако несколько аннотаций, похоже, дублируются (точно или очень близко). Должен ли я предпочесть аннотацию в jsr305.jar, если у меня есть выбор?

Обратите внимание, что мне просто не интересно знать, что было бы "лучше" использовать аннотации из jsr305.jar просто потому, что они представляют собой стандарт. Скорее, я хочу знать, будет ли инструмент FindBugs выполнять тот же (или лучший) анализ, если я предпочитаю версию jsr305.jar конкретной аннотации. Возможно, что некоторые аннотации 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 annotations дублируются:

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.NullnessAnnotation и NullnessAnnotationDatabase, чтобы получить первоначальное представление о том, как это делается внутренне. Посмотрите на этот пакет, и вы найдете похожие классы для других аннотаций, таких как jcip.

Итак, с точки зрения реализации это действительно не имеет значения. Для всех, кто еще не уверен, какие аннотации использовать, я бы рассмотрел использование стандартных аннотаций или самоопределенных, чтобы избежать того, чтобы их код зависел от библиотеки findbugs.