Ваш сотрудник неверен;то, что кажется NotNull, фактически является инструментом статического анализа LINT, не намекающим на потенциальный ноль.
void someMethod(String str);
void someMethod(@NotNull String str);
void someMethod(@Nullable String str);
Для этих трех сигнатур байт-код один и тот же (насколько мне известнопо крайней мере в Java 1.8).Разница в том, что LINT по умолчанию будет предупреждать вас, только если вы нарушите явный контракт.
Представьте, что бесполезная реализация каждого метода будет выглядеть так:
void someMethod(String str) {
str.toString();
}
void someMethod(@NotNull String str) {
str.toString();
}
void someMethod(@Nullable String str) {
str.toString();
}
Все LINT будут предупреждать меня здесь, в аннотированной версии, но только потому, что я явно говорю, что он может быть нулевым, а LINT видит, что я не проверяю.
Где ваш коллега ошибается, предполагаетчто первая версия считается ненулевойРазницу можно заметить при вызове:
String myStr;
someMethod(myStr);
В неаннотированной версии (void someMethod(String str) {
) по умолчанию в LINT отсутствует предупреждение о передаче значения NULL.
Однако в явно аннотированной версии (void someMethod(@NonNull String str) {
) LINT четко обнаруживает, что myStr не инициализирован (попробуйте даже вызвать как someMethod(null)
и найдите разницу).
В любом случае, в конце концов, аннотации - это просто подсказки, позволяющие принимать решения компилятору или процессору аннотации;он также используется плагином Android Studio и LINT.В конечном счете, решение использовать или не использовать аннотации также сводится к личным предпочтениям.Тем не менее, с ростом Kotlin, эти аннотации становятся важными для взаимодействия обоих языков.
Наконец, стоит отметить, что компилятор Java не остановит вас от компиляции указанного небезопасного кода, независимо от аннотаций.так что имейте это в виду.Я лично предпочитаю иметь их (даже если я думаю, что они выглядят неуклюже), потому что они заявляют о четком намерении.