2015-01-08 6 views
2

Я пытаюсь разными способами избавиться от NPE в моем коде. Я использую нулевой анализ в Eclipse, и я очень люблю @NonNullByDefault. Но сегодня я столкнулся с проблемой, с необязательными гуавы в:Guava Необязательный и @NonNull аннотация

private static Optional<Foo> bar() { 
    Foo foobar = new Foo(); 
    return Optional.of(foobar); 
} 

я получаю следующий комментарий по обратной линии:

Null type safety: The expression of type 'Optional<Foo>' needs unchecked conversion to conform to '@NonNull Optional<Foo>' 

Я попытался с помощью JSR305 аннотаций безрезультатно. Есть ли способ заставить его работать (использовать как необязательные, так и аннотации @NonNull)?

+0

Не нашел ничего подходящего. В большинстве статей описывается использование аннотаций или использование опций - ничего не используется для обоих. Я нашел дискуссию на форуме guava об использовании JSR305, но, как я уже сказал, переход на JSR305 не помог – Tarkis

+0

Похоже, что это не сработает, если Eclipse не позволит вам определять внешние методы как возвращающие @NonNull? –

+0

Что такое 'Foo' и почему вы пытаетесь вставить в него строку? –

ответ

0

Полное решение этого вопроса требует нулевых аннотаций в дополнительном API. В частности,() следует объявить return @NonNull.

Пока авторы библиотеки не аннотируют свой API, вам понадобятся внешние аннотации, поддержка которых разрабатывается для Eclipse Mars. https://wiki.eclipse.org/JDT_Core/Null_Analysis/External_Annotations

OTOH, мне любопытно, почему вам действительно нужны обе концепции избежания NPE, объединенные в одном проекте.

0

Код Guava обрабатывает ненулевые значения по умолчанию, но не использует аннотацию Eclipse @NonNullByDefault, так как он нестандартен. Вместо этого он использует стандартную аннотацию @Nullable, чтобы указать параметры и типы возврата, которые может быть null.

Проект awesome Error Prone обеспечивает проверку нулевой безопасности, совместимую с этим стандартным подходом - я бы предложил использовать его, а не пользовательские проверки IDE.