@NonNullByDefault и @Nullable Evaluation в Eclipse - PullRequest
0 голосов
/ 27 августа 2018

Я использую нулевые аннотации eclipse для проверки возможного NPE в моем коде.

Каждый класс в моем проекте имеет аннотацию @NonNullByDefault. Некоторые поля имеют аннотацию @Nullable.

Вот проблемный код:

@NonNullByDefault
public class MyClass{
    @Nullable
    private File myFile;

    public MyClass() {
        ...
        // Somewhere here myFile may or may not be initialised
        ...
        myMethod();
    }

    public void myMethod() {
        ...
        if( myFile != null ) {
            //AnotherClass also has @NonNullByDefault on it
            AnotherClass.callStaticFunction( myFile );
        }
    }
}

Этот код теперь дает мне сообщение об ошибке:

Null type mismatch (type annotations): required '@NonNull File' but this expression has type '@Nullable File'

и не скомпилируется.

Когда я меняю свой метод на:

public void myMethod() {
    ...
    File another = myFile;
    if( another != null ) {
        AnotherClass.callStaticFunction( another );
    }
}

код будет скомпилирован без каких-либо жалоб.

Почему это так?

1 Ответ

0 голосов
/ 28 августа 2018

Онлайн-документация содержит параграф "Случай полей", в котором подробно описываются тонкости, связанные с доступом к полям. По сути, анализ потока может делать только точные утверждения о переменных, которые принадлежат текущей области. Локальные переменные принадлежат , принадлежащему блоку, в котором они объявлены, поля не принадлежат , принадлежащему какой-либо лексической области, и, следовательно, подвержены непредвиденным последствиям из-за любого из

  • эффекты через псевдонимы
  • побочные эффекты другого метода
  • параллелизм

В том же тексте справки также описаны два возможных решения (если не вводить больше аннотаций, например, для указания владельца):

  • присваивание локальной переменной перед обработкой
  • «синтаксический анализ», который распознает ограниченный набор шаблонов, которые в нормальных условиях являются достаточно безопасными (без предоставления полных гарантий в этом случае).

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

Наконец, я должен упомянуть, что существует RFE для введения аннотации наподобие @LazyNonNull, которая в основном будет сигнализировать следующее:

  • Нет необходимости инициализировать такие поля во всех конструкторах.
    • Следовательно, поле может быть null.
  • Невозможно присвоить null такому полю.
    • Следовательно, нулевая проверка по полю достаточна для принятия ненулевого значения после проверки.

Дополнительные комментарии, выражающие спрос в этих направлениях, могут помочь мотивировать инвестиции к такому решению.

...