Javax.annotation: @Nullable vs @CheckForNull
В чем разница между этими двумя? Оба, по-видимому, означают, что значение может быть нулевым и должно быть обработано соответственно, то есть проверено на значение null.
Update:
Две аннотации, приведенные выше, являются частью JSR-305/FindBugs:
http://findbugs.sourceforge.net/manual/annotations.html
Ответы
Ответ 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.