Сама Java не поставляется с этими аннотациями.
Вместо этого существует около 10 взаимоисключающих подходов к этой идее, большинство из которых работают совершенно по-разному и применяют разные значения к тому, что NonNull
значит, куда вы можете его поместить и как он работает.
Богатство. Это очень прискорбно, поскольку основная идея использования аннотаций для добавления этой информации значительно превосходит необязательную и тому подобное, учитывая, что она будет полностью обратно совместима и не приведет существующий код к депрессии устаревания, в отличие от Optional
.
Итак, найдите тот, который вам нравится, и включите его в свой проект так же, как вы включаете любую стороннюю зависимость - обычно путем включения его в свой Maven/Gradle/Ant+ivy/etc (список зависимостей вашего файла сборки).
У Intellij есть свой собственный взгляд на ненулевое и обнуляемое. Это, наверное, самое удобное. Его представления о том, что означают эти аннотации, ниже 1. Фреймворк Checker является лучшим, eclipse занимает второе место, а все остальное (включая intellij) занимает третье место. лучшее решение можно найти в рамках проверки или, почти так же хорошо, в eclipse, в этих аннотациях. Однако я сомневаюсь, что системы проверки нулей intellij способны полностью понять его более продвинутые дополнения, такие как @PolyNull
, так что эта дополнительная выразительная сила будет в основном потрачена впустую. В качестве бонуса intellij предоставляет кучу данных о том, какими должны быть правильные аннотации о недействительности в основных библиотеках.
Последнее важно: наиболее часто используемые библиотеки java, в том числе java.*
сам по себе, не имеет этих аннотаций, и работа с кодом с наполовину нулевыми аннотациями, безусловно, является весьма неприятным занятием; затраты на это значительно перевешивают преимущества. Единственное реальное решение - "исправить" библиотеки, которые вы используете, с правильной информацией о недействительности, но это огромная работа. К счастью, intellij многое сделал для вас.
Я ожидал бы (eclipse делает это), что быстрое исправление (CMD+1 на компьютерах mac, CTRL+1 на компьютерах, не являющихся компьютерами Mac, по крайней мере, из коробки, если мне помогает память о сочетаниях клавиш по умолчанию) включает "автоматическое добавление аннотаций о недействительности eclipse в путь к классу" (или, в вашем случае, intellij, конечно). Если это почему-то не отображается, эта страница из документов intellij точно объясняет, как добавить org.jetbrains.annotations
библиотека, содержащая их аннотации о недействительности, для вашего проекта. На самом деле, эти документы указывают на то, что меню quickfix действительно предлагает вам возможность автоматического добавления этой библиотеки в качестве решения ошибки, которую вы получаете на своем @NonNull
узел в вашем исходном коде.
[1] Большинство аннотаций с нулевым значением значительно ограничивают себя, позволяя аннотацию только для полей, методов (подразумевая: что она возвращает) и параметров. Тем не менее, можно иметь определенно не нулевое значение List
из может быть-нулевым Map
экземпляры, которые определенно не являются нулевыми String
to может быть нулевым Integer
: @NonNull List<@Nullable Map<@NonNull String, @Nullable Integer>>
. Система аннотаций способна позволить вам написать это, но только в том случае, если ваши аннотации настроены исключительно для TYPE_USE. Аннотации фреймворка checker и eclipse nullity работают подобным образом; большинство других не работают и поэтому менее выразительны. CheckerFramework делает еще один шаг вперед и позволяет вам написать понятие "либо недействительность-это нормально". Так же, как дженерики имеют 3 формы (List<Integer>
, и List<? super Integer>
и List< extends Integer>
, как только задействованы универсальные, 2 значения null (либо никогда не равно нулю, либо определенно разрешено значение null) уже недостаточно, вам нужно больше значений null. структура проверки имеет @PolyNull
воля позволяет вам связывать пустоты: вы можете, например, написать этот метод в checkerframework, но вы не можете написать его правильно с помощью intellij или, если на то пошло, eclipse:
public void duplicateFirstMatch(List<T> elems, Predicate<T> matcher);
где идея: Этот метод запускает сопоставитель для каждого элемента в списке, и при совпадении этот элемент добавляется в конец списка. Этот метод может сработать, если T
считается "@NonNull " (учитывая, что в коде нет нулей, null никогда не может быть добавлен этим кодом, поэтому он не может нарушать ненулевое значение его элементов), но он работает так же хорошо, если T
является @Nullable
, при условии, что сопоставитель также имеет @Nullable T
конечно: теперь этот код может добавить null в список, но это нормально.
Таким образом T
не является ни недействительным, ни ненулевым, но Ts, упомянутые в подписи, должны соответствовать их недействительности. @PolyNull
решает эту проблему.