Правильный способ использования аннотации @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!");
}