Ненулевые аннотации и стандартные Java-пакеты - PullRequest
5 голосов
/ 18 апреля 2011

Я пытаюсь добавить аннотации, совместимые с findbugs, в проект, но заметил, что @Nonnull не всегда обрабатывается так, как я ожидал.Например, findbugs не предполагает, что стандартные нативные коллекции могут возвращать null:

void method(@Nonnull String bar) {...}

map = new HashMap();
method(map.get("foo"));

пройдет тесты findbugs, даже если это не так.Можно ли как-то настроить findbugs, чтобы в этом случае он был предупрежден?

1 Ответ

2 голосов
/ 18 апреля 2011

согласно документации,

Аннотированный элемент не должен быть нулевым. Аннотированные поля не должны быть нулевыми после завершения строительства. Аннотированные методы должны иметь ненулевые возвращаемые значения.

@Documented
@Target(value={FIELD,METHOD,PARAMETER,LOCAL_VARIABLE})
@Retention(value=CLASS)
@Nonnull(when=ALWAYS)
@TypeQualifierNickname
public @interface NonNull

или вы можете использовать @DefaultAnnotation (NonNull.class) для класса или пакета, а затем использовать @Nullable только для тех параметров, методов или полей, которые вы хотите разрешить равными нулю.

анализ сделан на источнике.

так что попробуйте, у меня это работает

/**
 * @param args
 */
public static void main(String[] args) {
    method( getValue());
}

private static void method(@NonNull Object obj){
    System.out.println(obj);
}

@CheckForNull
private static Object getValue(){
    Map map = new HashMap();
    return map.get("foo");
}

или вы можете попробовать Design By Contract, используя http://c4j.sourceforge.net/

...