Как указать, что поля элемента @Nonnull по умолчанию?
Мой вопрос является продолжением этого.
В прошлых версиях FindBugs можно было использовать @DefaultAnnotation(Nonnull.class)
или @DefaultAnnotationForFields(Nonnull.class)
, чтобы указать, что все поля в пакете должны рассматриваться как @Nonnull
. В текущей версии FindBugs (2.0), @DefaultAnnotation
и @DefaultAnnotationForFields
устарели, и мы все должны использовать JSR-305. Но JSR-305, похоже, не охватывает все обложки (теперь устаревших) FindBugs.
javadoc предлагает несколько альтернатив:
-
@ParametersAreNonnullByDefault
. Это (очевидно) применимо только к параметрам, а не к полям-членам.
-
@CheckReturnValue
, когда применяется к типу или пакету. Опять же, это не относится к полям участников.
-
@TypeQualifierDefault
. Возможно, это может делать то, что я хочу, но я не понимаю, как это работает, и я не могу найти никакой документации или примеров по ее использованию или намерению, кроме некоторого загадочного javadoc. Я думаю, что это поможет мне создать собственные аннотации, но могу ли я быть уверенным, что все инструменты (FindBugs, Eclipse и т.д.) Будут правильно интерпретировать эту новую аннотацию (или даже вообще)?
javadoc не содержит никаких подсказок о том, как справиться с его устареванием.
Итак, используя текущие версии FindBugs и/или JSR-305, как я должен указывать, что все поля членов в определенном пакете (или даже в определенном классе) должны рассматриваться как @Nonnull
? Возможно ли это?
Ответы
Ответ 1
У меня был аналогичный вопрос, и я обнаружил, что следующее работает с findbugs (2.0.1-rc2)
Создайте java файл со следующим определением аннотации
@Nonnull
@TypeQualifierDefault(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface FieldsAreNonNullByDefault
{
}
аналогично, чтобы гарантировать, что все возвращаемые значения из метода не равны нулю
@Nonnull
@TypeQualifierDefault(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ReturnTypesAreNonNullByDefault
{
}
а затем аннотировать пакет как обычно.
Я использовал следующее для своих тестов (package-info.java)
@javax.annotation.ParametersAreNonnullByDefault
@com.habit.lib.lang.FieldsAreNonNullByDefault
@com.habit.lib.lang.ReturnTypesAreNonNullByDefault
package com.mypackagename.subpkg;