Должны ли аннотации в jar305.jar быть предпочтительнее аналогичных аннотаций в annotation.jar для FindBugs? - PullRequest
12 голосов
/ 12 июня 2011

В дистрибутиве 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.CheckForNulledu.umd.cs.findbugs.annotations.CheckReturnValue → javax.annotation.CheckReturnValueedu.umd.cs.findbugs.annotations.NonNull → javax.annotation.Nonnull (прописная буква)edu.umd.cs.findbugs.annotations.Nullable → javax.annotation.Nullableedu.umd.cs.findbugs.annotations.When → javax.annotation.meta.When

Кроме того, все JCIP аннотаций дублируются:

net.jcip.annotations.GuardedBy → javax.annotation.concurrent.GuardedBynet.jcip.annotations.Immutable → javax.annotation.concurrent.Immutablenet.jcip.annotations.NotThreadSafe → javax.annotation.concurrent.NotThreadSafenet.jcip.annotations.ThreadSafe → javax.annotation.concurrent.ThreadSafe

1 Ответ

9 голосов
/ 12 июня 2011

Да, вы должны предпочесть аннотацию JSR305, если это возможно.Зачем?Потому что JSR305 является стандартом и имеет смысл придерживаться стандартов, где это возможно.При портировании своих приложений я не заметил никаких проблем или изменений в поведении.Более того, вы даже можете определить свою собственную аннотацию @NotNull, и findbugs ее подберут (если вы назовете ее NotNull), см. эту запись в блоге для более подробной информации .

Насколько я могуКак видно из источников, findbugs использует одни и те же методы анализа.Отправка осуществляется только на основе имени аннотации.Как упомянуто в сообщении блога , указанном выше, посмотрите на классы edu.umd.cs.findbugs.ba.NullnessAnnotation и NullnessAnnotationDatabase , чтобы получить начальный классПосмотрите, как это делается внутри.Взгляните на этот пакет, и вы найдете похожие классы для других аннотаций, например jcip.

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

...