Правильный способ использования аннотации @NonNull в Android Studio
Я хотел бы использовать аннотацию @NonNull
в Android, но я не могу понять, как правильно это сделать.
Я предлагаю вам этот пример:
public void doStuff(@NonNull String s){
//do work with s...
}
Поэтому, когда я звоню doStuff(null)
, IDE выдаст мне предупреждение. Проблема в том, что я не могу полагаться на эту аннотацию, поскольку, например, этот указывает, они не распространяются очень далеко. Поэтому я хотел бы поместить нулевую проверку в свой метод, например:
if(s==null) throw new IllegalAgrumentException();
Но среда IDE, предполагая, что s!=null
, предупредит меня, что s==null
всегда false. Я хотел бы знать, что это лучший способ сделать это.
Я лично считаю, что должна быть аннотация, такая как @ShouldntBeNull
, которая только проверяет и предупреждает, что null не передан ей, но не жалуется, когда значение равно null.
Ответы
Ответ 1
Вы можете использовать Objects.requireNonNull. Он проверит внутреннюю проверку (поэтому среда IDE не покажет предупреждение о вашей функции) и поднимите NullPointerException, когда параметр null
:
public MyMethod(@NonNull Context pContext) {
Objects.requireNonNull(pContext);
...
}
Если вы хотите выбросить другое исключение или использовать уровень API < 19, то вы можете просто сделать свой собственный вспомогательный класс для реализации той же проверки. например.
public class Check {
public static <T> T requireNonNull(T obj) {
if (obj == null)
throw new IllegalArgumentException();
return obj;
}
}
и используйте его так:
public MyMethod(@NonNull Context pContext) {
Check.requireNonNull(pContext);
...
}
Ответ 2
Вы можете использовать подавление стиля комментариев, чтобы отключить это конкретное предупреждение о недопустимой проверке, например:
public MyMethod(@NonNull Context pContext) {
//noinspection ConstantConditions
if (pContext == null) {
throw new IllegalArgumentException();
}
...
}
Вам понадобится //noinspection ConstantConditions
каждый раз, когда вы это сделаете.
Ответ 3
Примеры Google сделайте это следующим образом
import static com.google.common.base.Preconditions.checkNotNull;
...
public void doStuff(@NonNull String sParm){
this.sParm= checkNotNull(s, "sParm cannot be null!");
}