Заставьте Java вывести @NotNull для необязательных типов возврата

Использование Optionals в Java не защищает от NPE, поскольку значения все еще могут быть null:

Optional<String> myMethod() {
    return null;
}

Способ защиты от этого, по крайней мере, во время выполнения — использование аннотаций @NotNull. (Невозможно во время компиляции в Java, поскольку он не имеет ненулевых ссылок, в отличие от более сложных языков, таких как Swift и Kotlin).

Использование @NotNull приведет к немедленному сбою при обнаружении null, что предотвратит null обход программы и упростит определение источников ошибок. Его лучше всего сочетать с модульными тестами, чтобы сделать его устойчивым к поломкам из-за рефакторинга.

Насколько я могу судить, всегда имеет смысл использовать @NotNull для Optional возвращаемых значений и параметров.

Теперь вот вопрос: возможно ли как-то заставить Java автоматически выводить @NotNull для Optional возвращаемых значений и параметров? т.е. Мне не нужно писать его для каждого использования, а лучше иметь такое поведение, установив какой-либо параметр сборки или аналогичный?


person fabb    schedule 16.08.2018    source источник
comment
Вы можете использовать return Optional.empty();   -  person Sudhir Ojha    schedule 16.08.2018
comment
Это больше похоже на функцию IDE.   -  person Pinkie Swirl    schedule 16.08.2018
comment
@SudhirOjha нет, я хочу поймать ошибку раньше, если null будет возвращено / получено как можно раньше.   -  person fabb    schedule 16.08.2018
comment
@PinkieSwirl больше похож на отсутствующую языковую функцию ... Может быть, это можно решить с помощью какого-нибудь инструмента обработки аннотаций? А может действительно есть какой-нибудь IDE-плагин или линтер (CheckStyle?), который поможет с этим?   -  person fabb    schedule 16.08.2018
comment
@fabb, конечно, было бы неплохо, если бы это была языковая функция, но вы уже упомянули некоторые, которые это поддерживают. Идея AFAIK intellij поддерживает это, но, возможно, не так, как вы хотите (она добавляет значок желоба)   -  person Pinkie Swirl    schedule 16.08.2018
comment
одна вещь, которую я имею в виду, но мальчик, это было бы безумием, это инструментировать байт-код и выполнить referenceOfOptional.getClass (отбрасывая результат), и если он равен нулю, он потерпит неудачу. В противном случае, как далеко, по вашему мнению, пойдет этот код, пока кто-то не получит возможный возвращаемый тип Optional? Я не знаю, значит, вы хотели бы сделать это для Integer и всех других примитивов в штучной упаковке, поскольку они могут быть нулевыми? мне кажется слишком...   -  person Eugene    schedule 16.08.2018
comment
Фух, вот это сумасшедшая идея ????   -  person fabb    schedule 16.08.2018
comment
Вы можете добавить CheckerFramework в процесс сборки: checkerframework.org/manual/#nullness-checker   -  person user158037    schedule 16.08.2018
comment
CheckerFramework выглядит интересно, спасибо! Боюсь, что на наш огромный фреймворк уйдет много времени, но это уже другая история.   -  person fabb    schedule 16.08.2018
comment
@ user158037 вы хотите добавить свой комментарий в качестве ответа? Я бы согласился.   -  person fabb    schedule 17.08.2018


Ответы (1)


Необязательный не предназначен для хранения только ненулевых значений. Он также может содержать нулевые значения. Таким образом, ваше предложение противоречит дизайну Факультатива.

person DEVENDRA    schedule 16.08.2018
comment
Я знаю, что ссылка типа Optional может быть либо пустой, либо нулевой. Я хочу найти способ, используя вспомогательные инструменты, если это необходимо, чтобы гарантировать, что нулевой случай никогда не произойдет, или, по крайней мере, немедленно выдаст во время выполнения (как в случае @NotNull). - person fabb; 16.08.2018