Подтвердить что ты не робот

Javax.annotation: @Nullable vs @CheckForNull

В чем разница между этими двумя? Оба, по-видимому, означают, что значение может быть нулевым и должно быть обработано соответственно, то есть проверено на значение null.

Update: Две аннотации, приведенные выше, являются частью JSR-305/FindBugs: http://findbugs.sourceforge.net/manual/annotations.html

4b9b3361

Ответ 1

Я думаю, что это довольно ясно из добавленной вами ссылки: если вы используете @CheckForNull, а код, который использует это значение, не проверяет на null, FindBugs покажет его как ошибку.

FindBugs игнорирует @Nullable.

На практике эта аннотация полезна только для переопределения общей аннотации NonNull.

Используйте @CheckForNull в тех случаях, когда значение всегда должно быть проверено. Используйте @Nullable, где null может быть ОК.

EDIT: кажется, что @CheckForNull не поддерживается в настоящий момент, поэтому я предлагаю избегать его и использовать @NonNull (также см. Какую @NotNull Java-аннотацию следует использовать?). Другая идея заключалась бы в том, чтобы напрямую связаться с разработчиками FindBugs и спросить их мнение о несогласованности в документации.

Ответ 2

@Nonnull и @Nullable правильно обрабатываются IntelliJ IDEA. FindBugs нашел проблему с @Nonnull но пропустил их для @Nullable и @CheckForNUll. Проблемы, которые были обнаружены IDEA и FindBugs, отмечены комментариями.

package com.db.icestation;

import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;

public class test {

    @Nullable public String nullable() {
        return "";
    }

    @Nonnull public String nonnull() {
        return null; // IDEA, findbugs
    }

    @CheckForNull public String checkForNull() {
        return null;
    }

    public static void main(String[] args) {
        System.out.println(new test().nullable().length()); // IDEA
        System.out.println(new test().nonnull().length());
        System.out.println(new test().checkForNull().length());
    }
}

Ответ 3

В IntelliJ Idea @javax.annotation.Nullable поддерживается по умолчанию, и любые попытки разыменования аргументов @Nullable или возвращаемых значений приводят к предупреждению.

@alexander-pavlov, вы можете добавить @javax.annotation.CheckForNull в настройку проверки "Constant conditions and exceptions". Go File- > Settings- > Inspections- > Вероятные ошибки- > Константные условия и исключения- > Настроить аннотации.

Я предпочитаю делать это, поскольку @CheckForNull имеет более четкое значение, чем @Nullable, как упоминалось в его ответе @lbalazscs.