Какой @Nullable использовать в Java (начиная с 2023/JDK21)?

По состоянию на 2023/JDK21, что@Nullableиспользовать в Java?

Во многих интернет-материалах даже не упоминается, какой должен быть импорт.
Итак, теперь (темная) история, в каком порядке появились эти аннотации.

Я надеюсь на общий ответ и из авторитетного источника (пожалуйста, цитируйте документацию). Для JDK21 также может подойти какая-нибудь статья.

Напримерjavax.annotation.Nullableможет быть предпочтительнее. А в какой версии это было введено? (Мы используем JDK17, возможно, в следующем году некоторые проекты обновятся до JDK21)

2 ответа

ИМОjakarta.annotation.Nullableиз jakarta.annotation-api — это приближение к «стандарту». Старый репозиторий javax.annotation ссылается на его источники , и, как указано в комментарии , с этим справится всегда популярная среда проверки.

В 2023 году лучший выбор дляи@NonNullаннотация остается аннотацией Checker Framework . Это стандарт де-факто (import org.checkerframework.checker.nullness.qual...появляется в 75 тысячах файлов на GitHub), распознается самым широким спектром инструментов, представляет собой надмножество большинства других аннотаций, имеющих значение null, и имеет четкую стандартную семантику.

Аннотация полезна для различных целей.

  • Вы можете написать это как краткую и точную документацию.

  • Вы можете использовать инструмент для проверки или эвристической проверки этой документации. Примеры включают в себя:

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

    • NullAway — это более простой инструмент, который поддерживает только проверку нулевых значений и работает быстрее, чем Nullness Checker.

    • Многие другие.

  • Некоторые среды автоматизированного тестирования учитывают аннотацию при создании тестов.

В вашем вопросе упоминаетсяjavax.annotation.Nullable. Эта аннотация не одобрена Oracle и ей никогда не было разрешено использоватьjavaxпространство имен (это было сделано в нарушение бинарной лицензии Oracle Java). Инструмент FindBugs, который его представил, был заброшен.

Официального ответа на ваш вопрос, одобренного Oracle, не существует. JSR 305, целью которого было определить такую ​​аннотацию, был заброшен, и (согласно моему разговору с Марком Рейнхолдом, главным архитектором группы платформ Java в Oracle), Oracle не заинтересована в его возрождении. Каждый@Nullableаннотация предоставляется сторонней библиотекой и игнорируетсяjavac. Аннотация читается только сторонними инструментами, такими как обработчики аннотаций.

Другие вопросы по тегам