Какую @NonNull Java-аннотацию использовать

Какая лучшая аннотация NoNull?

"Лучший" в смысле

  • Стандартный способ, например. будущая доказательность (например, поддержка стандартным jdk и т.д.).
  • Поддержка IDE (отображается в java-документе, чтобы указать использование для разработчиков)
  • Поддержка инструментами статического анализа, такими как findbugs
  • Поддержка анализа времени выполнения

Вот как выглядит мир в настоящее время - оценивается любое дальнейшее понимание:

  • javax.validation.constraints.NotNull (Docs)
    + пакет javax, таким образом, выглядит будущим - Часть JEE не JSE. В JSE необходимо импортировать дополнительные библиотеки.
    - Не поддерживается инструментами статического анализа (только проверка выполнения)

  • edu.umd.cs.findbugs.annotations.NonNull (docs)
    - внешняя библиотека, а не пакет javax
    - устарел, так как findbugs версии 3.X
    + используется для статического анализа (с помощью findbugs и, следовательно, Sonar)

  • javax.annotation.Nonnull (docs)
    + используется для статического анализа (в поисковых системах)
    - JSR-305 неактивен/мертв/неизвестен, как на список рассылки fb. Автор Билл Пью, даже если прямо спросил, не прокомментировал состояние в годы...

  • org.eclipse.jdt.annotation_2.0.0 (docs, интересно презентация)
    + используется для статического анализа (в eclipse не в findbugs)

    - проприетарное затмение (не пыталось использовать их автономно)

  • org.jetbrains.annotations.NotNull (docs)
    + используется для статического анализа (в intelliJ не в findbugs)) - проприетарный для IntelliJ (но также общедоступный как банку)

  • lombok.NonNull (docs)
    + используется для управления генерацией кода
    - проприетарная аннотация

  • android.support.annotation.NonNull (docs)
    + статический анализ в андроид-студии
    - андроидная специфическая аннотация

  • org.checkerframework.checker.nullness.qual.NonNull (docs)
    + JSR308 реализация, которая является частью Java8 (в которой появилась возможность писать аннотации в разных частях вашего кода, но не вводили новые аннотации)
    + используется для статического кода (но не findbugs) и анализ времени выполнения
    - Внешняя библиотека, однако, кажется одобрена пользователями java

В настоящее время я бы склонен к Checker Framework, но я с нетерпением жду других просмотров...

[отказ от ответственности] Я знаю, что вопрос был задан здесь, однако ответа не было (или ответ был неправильным/неполным/устаревшим) [/Отказ от ответственности]

Ответ 1

Нет стандартной аннотации @NonNull. Создание такой аннотации было целью JSR 305, которая была оставлена ​​в течение длительного времени. Не будет стандартной аннотации @NonNull до тех пор, пока JSR 305 не будет восстановлен. У Oracle нет текущих планов сделать это. (Аннотации JEE выходят за рамки JSR 305.)

Для будущей изоляции наиболее важным фактором, который следует учитывать, является аннотация для аннотации типа или аннотации объявления. Поскольку @NonNull указывает свойство значения переменной, а не самой переменной, оно должно быть аннотацией типа. Являясь аннотацией типа, вы также можете записывать аннотацию на большее количество местоположений, как в List<@NonNull String>.

Вы можете определить, является ли аннотация аннотацией типа, просмотрев мета-аннотацию @Target в определении аннотации. На момент написания этой статьи кажется, что только версии Checker Framework и Eclipse являются аннотациями типа, поэтому я бы выбрал их над теми, которые являются аннотациями объявления. Обратите внимание, что разработчики любой из других аннотаций могут также обновить их как аннотации типов; Я не знаю их планов.

Единственным недостатком является то, что использование аннотации типа требует использования компилятора Java 8. Checker Framework имеет механизмы, позволяющие компилировать код, содержащий его аннотации, компилятором Java 7.