Подтвердить что ты не робот

Как указать, что поля элемента @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? Возможно ли это?

4b9b3361

Ответ 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;