Какой @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
. Аннотация читается только сторонними инструментами, такими как обработчики аннотаций.