Правильный способ использования аннотации @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 всегда ложно. Я хотел бы знать, как лучше всего это сделать.

Лично я считаю, что должна быть аннотация типа @ShouldntBeNull, которая только проверяет и предупреждает, что ей не передается null, но не жалуется, когда значение проверяется на null .


person MMauro    schedule 18.09.2015    source источник
comment
Я хотел бы знать, как лучше всего это сделать - в среде IDE должно быть быстрое исправление, чтобы подавить это предупреждение. Лично я считаю... -- вы можете отправить запрос на добавление функции, если тебе нравится.   -  person CommonsWare    schedule 18.09.2015
comment
@CommonsWare Похоже, что в Android Studio 1.3.2 нет быстрого исправления SuppressWarning   -  person MMauro    schedule 18.09.2015
comment
Ну, это воняет. :-(   -  person CommonsWare    schedule 18.09.2015
comment
В любом случае, я сделал, как вы предложили, и подал запрос на функцию. Вы можете найти его здесь   -  person MMauro    schedule 18.09.2015


Ответы (3)


Вы можете использовать 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);
    ...
}
person TmTron    schedule 03.10.2016

примеры Google делают это следующим образом.

import static com.google.common.base.Preconditions.checkNotNull;

...

public void doStuff(@NonNull String sParm){
     this.sParm= checkNotNull(s, "sParm cannot be null!");
}
person user60108    schedule 09.12.2016

Вы можете использовать подавление в стиле комментариев, чтобы отключить это конкретное предупреждение о нулевой проверке, например:

    public MyMethod(@NonNull Context pContext) {
        //noinspection ConstantConditions
        if (pContext == null) {
            throw new IllegalArgumentException();
        }
        ...
    }

Вам понадобится это //noinspection ConstantConditions каждый раз, когда вы будете это делать.

person Darrell    schedule 19.09.2015