Должны ли аннотации в 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.