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

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

Другие вопросы по тегам