После нескольких чтений и вопросов как этот мне было интересно, есть ли смысл использовать @NonNull
Андроид аннотации для Android.
Я вижу небольшое предупреждение от Android Studio, если попытаюсь вызвать метод с параметром null, который аннотируется как @NonNull. Просто предупреждение?
Как насчет модульного тестирования? Должен ли я протестировать метод с нулевым параметром? Если я это сделаю... я получу NullPointerException
, и мой тест завершится неудачно.
Скажем, мы два разработчика. Один из них работает над API и один тестирует API во всех манерах. Как второй разработчик, я обязан проверить все, чтобы API был пуленепробиваемым. То, что весь пункт Unit Testing, правильно?
Итак, тогда... что точка первого разработчика, использующая @NonNull?
Если кто-то другой должен был использовать этот API с нулевым параметром... тогда API будет бросать NPE. Затем он подумал: "Ург, этот API отстой... NPE!" и он будет прав. Этот непослушный разработчик, не проверяющий, имеет ли параметр, который он отправил, null или нет, должен сталкиваться с IllegalArgumentException, потому что это его ошибка не в том, что у API!
Я не прав?
Я думал, что эти аннотации заставят компилятор показать такие ошибки, как attempting to call methodName(@NonNull Object object) with null parameter
.
Обновление 1
Хорошо, спасибо всем за ваши комментарии. Я хотел бы высказать, если возможно, вопрос "проблема", с которой я столкнулся. Абстрактным образом.
Я пишу некоторый код (API, Библиотека, класс, любой) с закрытым внутренним кодом, обернутым общедоступными методами, предоставляющими функции.
Предположим, что эти общедоступные методы будут использоваться кем-то другим (включая меня). Некоторые из них принимают аргументы, которые никогда не должны быть null, иначе все ад сломается.
Считывая ваши комментарии, я столкнулся со следующими вариантами:
- Продолжайте использовать контракты/аннотации (
@NonNull
), поддерживаемые документацией Java, предусматривающиеparameter must not be null
. Не проверяйте нулевые параметры (иначе IDE будет предупреждать меня) и, как-то, молитесь, чтобы я никогда не получил нулевой параметр; - То же, что и выше, но применяйте нулевую проверку (даже если IDE будет предупреждать, что
condition will always be false
) и бросатьIllegalArgumentException
вместо того, чтобы вызывать NPE в случае, если я получаю нулевой параметр; - Остановить использование контрактов/аннотаций, использовать Java Doc для предупреждения других разработчиков и добавить ручную проверку для всех параметров.
Наконец, для модульного тестирования... Я знаю, что я не могу иметь пуленепробиваемый код, но мне нравится "обезвреживать" мой код как можно больше, чтобы предотвратить неожиданное поведение из моего кода, а также для проверки процесса (который, как я полагаю, лежит в основе Unit Testing) -